xml
extensible markdown language
<?xml version="1.0" encoding="utf-8"?>
<!--引入dtd-->
<!-- 文档类型 根标签名字 网络上的dtd dtd名称 dtd的路径-->
<persons>
<person>
<name id="123">老张</name>
<age>18</age>
<commit><![CDATA[<a href="www.baidu.com"><ds>34</ds></a>]]></commit>
</person>
<person>
<name id="143">老李</name>
<age>19</age>
<commit><![CDATA[<a href="www.baidu.com"><ds>24</ds></a>]]></commit>
</person>
</persons>
CDATA区 让xml解析器,将特殊字当作文本,而不是当成标签来解析
xml解析方式
常用的有两种
DOM
(Document Object Model)
将整个xml读入内存,形成树形结构来解析,可以进行增删改查操作
SAX
(Simple API for XML)
读取一行,解析一行。只能查询
解析手段
dom4j
//SAX解析
//1.创建SAXReader对象
SAXReader reader=new SAXReader();
try {
//2.获取xml源
Document document=reader.read(new File("src/main/resources/test.xml"));
//3、得到元素
//根元素
Element root=document.getRootElement();
//
System.out.println(root.element("person").element("age").getText());
//
List<Element> list=root.elements("person");
for(Element e:list) {
Element name=e.element("name");
Element age=e.element("age");
System.out.println(name.getName()+":"+name.getText()+","+age.getName()+":"+age.getText());
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
xpath
//SAX解析
//1.创建SAXReader对象
SAXReader reader=new SAXReader();
try {
//2.获取xml源
Document document=reader.read(new File("src/main/resources/test.xml"));
//3、得到元素
//根元素
Element root=document.getRootElement();
Element name=(Element)root.selectSingleNode("/persons/person/name");
System.out.println(name.getText());
/*
/tagname 表示获取该目录直接下层中标签名为tagname的元素
//tagname 表示 获取该目录子孙层中所有标签名为tagname的标签
*/
List<Element> names=root.selectNodes("//name");
for(Element n:names) {
System.out.println(n.getName()+":"+n.getText()+"--"+n.attributeValue("id"));
}
} catch (DocumentException e) {
e.printStackTrace();
}
XML约束
DTD
(Document Type Definition)语法自成一派,可读性较差
<!--test.dtd-->
<!-- 元素格式 <!ELEMENT 元素名称 元素类型> -->
<!ELEMENT persons (person)+>
<!ELEMENT person (name,age,commit)>
<!-- #PCDATA表示标签的值是被解析的文本 (Parser Character Data) -->
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT commit (#PCDATA)>
<!--属性格式-->
<!--<!ATTLIST 元素名称 属性名称 属性类型 默认值> -->
<!ATTLIST name id CDATA #IMPLIED>
<!---test.xml->
<?xml version="1.0" encoding="utf-8"?>
<!-- 引入dtd -->
<!-- 1.引入网络上的dtd <!DOCTYPE 根元素名称 PUBLIC "dtd名称" "dtd的路径">
<!DOCTYPE persons PUBLIC "//UNKNOWN/" "unknown.dtd">
-->
<!-- 2.引入外部文件 <!DOCTYPE 根元素名称 SYSTEM "dtd路径">
<!DOCTYPE persons SYSTEM "unknown.dtd">
-->
<!-- 3.直接嵌入dtd
<!DOCTYPE 根元素名称[
约束
]>
-->
<!DOCTYPE persons SYSTEM "test.dtd">
<persons>
<person>
<name id="_123">老张</name>
<age>18</age>
<commit><![CDATA[<a href="www.baidu.com"><ds>34</ds></a>]]></commit>
</person>
<person>
<name id="_143">老李</name>
<age>19</age>
<commit><![CDATA[<a href="www.baidu.com"><ds>24</ds></a>]]></commit>
</person>
</persons>
Schema
使用xml语法规则,xml解析器,解析起来较为方便。
<!-- test.xsd -->
<?xml version="1.0" encoding="UTF-8"?>
<!--
xmlns(xml namespace) 命名空间-w3c制定
targetNamespace 目标命名空间
elementFormDefault 元素的格式化情况
-->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/test"
elementFormDefault="qualified">
<element name="persons">
<!-- complexType 用于声明persons标签是复杂元素 -->
<complexType>
<!-- 复杂元素:
<sequence> 表明元素必须按照顺序出现。
<all> 元素的顺序可以任意。 但是元素出现的次数有且仅有一次。
<choice> 简单元素只能出现其中的一个。
-->
<sequence maxOccurs="unbounded">
<element name="person">
<complexType>
<sequence>
<!-- 简单元素 -->
<element name="name" type="string"></element>
<element name="age" type="integer"></element>
<element name="commit" type="string"></element>
</sequence>
<!-- 属性:只能出现在复杂元素中 -->
<attribute name="id" type="int" use="optional"></attribute>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
<!-- test.xml -->
<?xml version="1.0" encoding="utf-8"?>
<!-- 对Schema的引用 -->
<!--
在根标签中引用
xmlns:xsi (xml schema instance) 值固定
xmlns 填写schema中的targetNamespace,可以指定命名空间名
名称空间的作用是在写元素时,可以指定该元素使用的是哪一套约束规则
xsi:schemaLocation="{namespace} {location}"
-->
<persons
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aa="http://www.example.org/test"
xmlns="http://www.example.org/test"
xsi:schemaLocation="http://www.example.org/test test.xsd"
>
<person id="123">
<aa:name >老张</aa:name>
<age>18</age>
<commit><![CDATA[<a href="www.baidu.com"><ds>34</ds></a>]]></commit>
</person>
<person id="143">
<name >老李</name>
<age>19</age>
<commit><![CDATA[<a href="www.baidu.com"><ds>24</ds></a>]]></commit>
</person>
</persons>
一个xml只能指定一个DTD,但可以指定多个schema