xml
普通数据区CDATA:<![CDATA[ 内容 ]]>
PI指令:通过<?xml-stylesheet type = "text/css" href = "地址"?> 可以引入css样式
xml的约束 dtd约束、schema约束
dtd约束
一个xml中只能有一个dtd约束文件
元素定义:<!ELEMENT 元素名 约束>
约束类型:
对于简单元素
(#PCDATA)字符串、EMPTY空、ANY任意
对于复杂元素
元素名 (子元素1+,子元素2?,子元素3*,子元素4|子元素5),其中逗号表示出现顺序,+为至少一次,?表示有或没有,*表示任意次,默认表示只能一次,|表示其中的一个
属性定义:<!ATTLIST 元素名
属性名 属性类型 约束>
属性类型:CDATA 字符串、枚举 没有关键字 用A|B|C表示、ID 只能时字母或者下划线开头
约束类型:#REQUIRED 该属性必须出现、#IMPLIED 该属性可以不出现、#FIXED "" 表示该属性为一个固定值 可以使|、直接值 如果不写默认为该值
定义实体:<!ENTITY TEST "值" >、通过&TEST;引用该实体,需要在内部dtd中使用
dtd的引入方式:外部文件、xml文件中、网络url
外部文件格式
<!ELEMENT 元素名 约束>
<!ELEMENT 元素名 约束>
<!ELEMENT 元素名 约束>
……
引入方式:<!DOCTYPE 根元素名称 SYSTEM ”dtd路径“>
xml文件中的格式
<!DOCTYPE 根元素名 [
<!ELEMENT 元素名 约束>
<!ELEMENT 元素名 约束>
<!ELEMENT 元素名 约束>
……
]>
schema约束
符合xml语法,一个xml中可以有多个schema约束,通过namespace区分,可以指定更具体的类型,非常强大,但是语法复杂
约束文件text.xsd
<?xml version="1.0" encoding="UTF-8"?> <!-- xmlns = "http://www.w3.org/2001/XMLSchema" 代表当前是一个约束文件 --> <!-- targetNamespace="http://www.xiao.com/2015020"表示这个约束文件的地址 --> <schema xmlns = "http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.xiao.com/2015020" elementFormDefault="qualified">// <element name="person"> <complexType>//复杂元素 <sequence>// <sequence>表示按照顺序,<all> 表示只能出现一次,<choice>表示只能是其中一个,<any>表示任意 <element name="name" type="string" maxOccurs = "unbounded"></element>maxOccurs表示出现次数,unbounded表示无限次 <element name="age" type = "int"></element> </sequence>
<attribute name = "" type = "" use = ""></attribute>
</complexType> </element> </schema>
使用约束文件:
<?xml version="1.0" encoding="UTF-8"?> <person xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"//说明是一个被约束文件,用xsi代表一个命名空间,可以自定义名字 xmlns = "http://www.xiao.com/2015020"//约束文件地址 xsi:schemaLocation="http://www.xiao.com/2015020 text.xsd"> <name>"beautiful"</name> <age>29</age> </person>
xml解析方式
DOM方式 和 SAX方式
解析器:jaxp、dom4j
DOM:
jaxp解析器的两个抽象类:
DocumentBuilder:解析器类
DocumetnBuilderFactory:解析器工厂
四个接口:
Document:代表整个文档的对象
Element:一个元素对象
Node:一个节点对象,整个文档由多个节点构成
Attr:属性对象
具体过程:得到解析器工厂——得到解析器——得到Document对象——得到根元素——根据元素的getNodeChilds循环或迭代找出所有节点
SAX
两个抽象类
SAXParserFactory:解析器工厂
SAXParser:解析器
一个类
DefaultHandler:继承该类,并重写startElement、characters、endElement方法
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
public void endElement(String uri, String localName, String qName) throws SAXException
public void characters(char[] ch, int start, int length) throws SAXException
在startElement中解析开始标签,characters解析text节点,endElement中解析结束标签
dom4j解析
SAXReader reader = new SAXReader();
Document document = reader.read("filePath");
通过document对象可以得到根元素,然后解析器子元素
private static void parseXML(String path) { SAXReader reader = new SAXReader(); try { Document document = reader.read(new File(path)); Element root = document.getRootElement(); // parse(root); Element student = root.element("student"); List<Element> list = student.elements(); Element school = DocumentHelper.createElement("school");//生成元素 school.setText("cdut"); list.add(1, school);//特定位置添加 OutputFormat format = OutputFormat.createPrettyPrint();//设置格式 XMLWriter writer = new XMLWriter(new FileOutputStream(path),format);//回写 writer.write(document); } catch (DocumentException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
XPATH
XPATH写法
/aaa/bbb:表示aaa标签下的bbb元素(一层)
/aaa//bbb:表示aaa标签下的所有bbb元素(多层)
/aaa/*:aaa层下的所有元素
/aaa/bbb[1]:aaa层下第一个名为bbb的元素
//aaa[@id]:属性名有id且名为aaa的元素
/aaa[@id = "1"]:第一层元素名为aaa,属性名有id,且id的值为"1"的元素
XPATH与DOM4J
引入jar包:jaxen.jar
具体实现:
private static void parseXML(String path) { SAXReader reader = new SAXReader(); try { Document document = reader.read(new File(path)); // get single node in particular position // Node name = document.selectSingleNode("/Students/student/age[1]"); // System.out.println(name.getText()); // get node list of all ele which has name "age" // List<Node> nodeList = document.selectNodes("//age"); // for(Node node : nodeList) { // System.out.println(node.getText()); // } } catch (DocumentException e) { e.printStackTrace(); } }