xml

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

posted @ 2020-05-01 15:42  赵钱富贵  阅读(139)  评论(0编辑  收藏  举报