XML文档的解读

本文介绍了XML的主要作用,包括保存数据、作为配置文件和数据传输载体。阐述了XML文档结构,如倒状树形、文档声明等。还讲解了XML解析方式,常用的有DOM和SAX,以及对应的API。最后介绍了XML的文档约束,包括DTD和Schema及其用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

XML主要作用:
1.保存数据
2.配置文件
3.数据传输载体
XML文档结构:
倒状树形结构

xml文档声明

<?xml version="1.0" encoding="gbk" standalone="no"?>

xml文件必须要有一个顶层元素
version是xml的版本
encoding是解析xml所采用的编码
standalone判断是不是一个独立的文档,yes是独立的文档,没有外部引入依赖,no相反。

保存时的编码格式和解析时的编码格式一致,不会产生乱码。

ANSI默认编码GBK。
电脑上的文件在存储的时候,并不是真正的存储文字,而是存储这些文字对应的二进制。

建议使用UTF-8编码。
保存时默认为GBK。
gb2312早期国标。gbk相当于他的进阶版,包含生僻字。

<元素名称 属性名称=“属性的值”></元素名称>
xml注释:与html的注释一样<!-- -->
xml的注解不允许放置在文档的第一行,必须在文档声明之下。

严格地讲,在 XML 中仅有字符 “<“和”&” 是非法的。省略号、引号和大于号是合法的,但是把它们替换为实体引用是个好的习惯。

  <   &lt;
  &   &amp;

如果某段字符串里面有过多的字符, 并且里面包含了类似标签或者关键字的这种文字,不想让xml的解析器去解析。 那么可以使用CDATA来!

<des><![CDATA[<a href="">6666</a>]]></des>

XML 解析其实就是获取元素里面的字符数据或者属性数据。
XML解析方式(面试常问)有很多种,但是常用的有两种。

  • DOM
  • SAX
    DOM解析document object model是将整个文档全部读到内存当中形成树状结构。整个文档称之为document对象,属性对应attribute对象,所有的元素节点对应element对象,文本称之为text对象,这四个合起来成为Node节点。当xml特别大的时候,采用DOM解析会造成内存溢出。DOM解析可以对文档进行增删操作。
    SAX解析simple api for xml 基于事件驱动。读取一行解析一行,不会造成内存的溢出,不可以进行增删操作,只能进行查询。

针对以上两种解析方案的api,目前dom4j用的比较广泛。
SAX的简单使用

//创建SAX读取对象
		SAXReader saxReader = new SAXReader();
		try {
		//制定解析的xml文件    需要导入dom4j-1.6.1.jar
			Document read = saxReader.read(new File("src/NewFile.xml"));
//			得到根元素
			Element rootElement = read.getRootElement();
//			获取根元素下的子元素
			rootElement.element("stu").getName();
			rootElement.element("stu").element("age").getStringValue();
//			根元素下的所有子元素
			List elements = rootElement.elements();
			System.out.println(rootElement.getName());
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

DOM4j的Xpath使用
dom4j里面支持Xpath的写法,xpath其实是xml的路径语言,支持在我们解析xml的时候快速定位。

//要想使用Xpath,还需要导入jar包。   jaxen-1.1-beta-6.jar
			Element nameElement=(Element) rootElement.selectSingleNode("//name");
			List<Element> list = rootElement.selectNodes("//name");

XML的文档约束两种:DTD和Schema。
Schema是DTD的继承者。

DTD语法自成一派,早期就出现的。 可读性比较差。
Schema其实就是一个xml,使用xml的语法规则,解析比较方便。 但是他的约束文件的内容比DTD的还要多,所以目前还没有真正意义上的替代DTD。

DTD的用法

<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入DTD来约束这个xml文件 -->
<!--文档类型  根标签名字 本地的dtd  -->
	<!-- <!DOCTYPE stus SYSTEM "stus.dtd"> -->
	
	<!--    文档类型  根标签名字 网络上的dtd   dtd的名称   dtd的路径
   	<!DOCTYPE  根元素名称  PUBLIC  "DTD名称"  "DTD文档的URL"> -->
   	
<!DOCTYPE stu [
	<!ELEMENT stus (stu)>
	<!ELEMENT stu (name,age)>
	<!ELEMENT name (#PCDATA)>
	<!ELEMENT age (#PCDATA)>
]>
<stus>
	<!-- 11111111 -->
	<stu>
		<name>122</name>
		<age>12</age>
		<!-- <address><![CDATA[<a>hdhhdhdh</a>]]></address> -->
	</stu>
</stus>

声明元素的属性:

<stu id="123">
<!ATTLIST stu id CDATA #IMPLIED>      IMPLIED代表属性可有可无。或者这个用默认值代替。也可以写成ID,代表唯一id。
<!ELEMENT stus (stu)+>     +一个或多个  * 零个或多个  ?零个或一个
<!ELEMENT stu (name,age)>  按照顺序来
<!ELEMENT stu (name|age)>  两个中只能包含一个子元素。

schema的简单使用:

xmlns="http://www.w3.org/2001/XMLSchema"   命名空间
targetNamespace="http://www.example.org/NewXMLSchema"   目标的名称空间,下面定义的那些元素都与这个名称空间绑定上。
elementFormDefault="qualified">  元素的格式化情况。

xml如果是这样

<?xml version="1.0" encoding="UTF-8"?>
<!-- 
xmlns:xsi : 这里必须是这样的写法,也就是这个值已经固定了。
xmlns : 这里是名称空间,也固定了,写的是schema里面的顶部目标名称空间
xsi:schemaLocation : 有两段: 前半段是名称空间,也是目标空间的值 , 后面是约束文档的路径。
 -->
<teachers
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://www.example.org/NewXMLSchema"
	xsi:schemaLocation="http://www.example.org/NewXMLSchema NewXMLSchema.xsd">
	<teacher>
		<name>122</name>
		<age>12</age>
	</teacher>
</teachers>

那么,Schema约束文件就是:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
		targetNamespace="http://www.example.org/NewXMLSchema" 
		elementFormDefault="qualified">
	<!-- 这是一个复杂元素 -->
	<element name="teachers">
		<complexType>
			<!-- unbounded无限个teacher,也可以直接填入个数 -->
			<sequence maxOccurs="unbounded">
				<!-- 这是一个复杂元素 -->
				<element name="teacher">
					<complexType>
						<sequence>
							<!-- 简单元素 -->
							<element name="name" type="string"></element>
							<element name="age" type="int"></element>
						</sequence>
					</complexType>
				</element>
			</sequence>
		</complexType>
	</element>
</schema>

名称空间的作用:
xml只能引入一个DTD文件约束,但是可以引用多个Schema文件约束。
引入多个Schema的时候声明需要这样写:

xmlns::aa="http://www.example.org/NewXMLSchema"
xmlns::bb="http://www.example.org/NewXMLSchema"

元素用哪个约束可以这样写:

<bb:name>122</bb:name>
<aa:age>12</aa:age>

名称空间的作用就是在写元素的时候,指定该元素用的是哪套约束规则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值