day02_xml的解析和代码实现

本文深入讲解XML的DOM和SAX解析方式,演示了如何使用DOM4J读取XML元素,并介绍了Xpath的使用方法。此外,还探讨了XML的DTD和Schema约束,包括它们的语法和引入方式。

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

xml 的解析

就是获取元素里面的字符数据或者属性数据

1 解析方式:

方式有很多种,但是常用的只有两种DOM 和 SAX

方式1:

DOM :(document object model)解析会把所有的文档读到内存中形成树状结构
然后整个树状结构称之为一个对象,这个对象的名字叫做document然后再进行解析element(元素),attribute(属性),
text(文本),这四个对象统称为Nod 节点

方式2:

SAX: (simple api for xml ) 基于时间驱动,读取一行,解析一行
因为读取的内容少,所以不会造成内存溢出,不可以进行增删,只能进行查询。

针对以上两种解析方式,不同公司给出了不同的方案
常用的有:

jaxp sun 比较繁琐
jdom, dom4j 的应用比较广泛

简单代码示例java 中读取

package test;

import java.io.File;

import org.dom4j.io.SAXReader;

public class mainTest {
	public static void main(String[] args) {
		try {
			SAXReader reader = new SAXReader();
			reader.read(new File("src/stus/stus.xml"));
		} catch (Exception e) {
			e.printStackTrace();
		}
	
	}
}

这里会莫名出现五个warning,原因是jar 包太老了,需要更新jar 包或者降低jdk 的版本。我们这里选择降低jdk 的

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.dom4j.io.SAXContentHandler (file:/C:/Users/Administrator/Desktop/javaweb/day01_xml&tomcat/xmlDemo/lib/dom4j-1.6.1.jar) to method com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser$LocatorProxy.getEncoding()
WARNING: Please consider reporting this to the maintainers of org.dom4j.io.SAXContentHandler
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

不出以外,还是报warning,那就升级jar包找到最新的版本在重新导入添加路径中,没有warning了。搞定。
然后我们在代码中实现根元素stus下子元素stu的子元素的读取

Element rootElement = document.getRootElement();//首先得到根元素
Element element = rootElement.element("stu");//再得到根元素的子元素
List<Element> elements = rootElement.elements();//再取得子元素的集合
	for(Element a:elements) {
				String name =a.element("name").getText();
				String age = a.element("age").getText();
				String address = a.element("address").getText();
				System.out.println(name +"  "+age+"  "+ address);
			}//遍历集合并输出
			

Xpath的使用

1 dom4j 里面支持Xpath 的写法。xpath 其实是xml 路径语言,支持我们再解析xml 的时候,能够快速定位到具体的元素。

Element nameelement = (Element) rootElement.selectSingleNode("//name");
			System.out.println(nameelement.getText());
			
			List<Node> selectNodes = rootElement.selectNodes("//name");
			for(Node n:selectNodes) {
				System.out.println(n.getText());
			}

xml约束

如下的文档,属性的id 值是一样的,但是在日常生活中不常见,而且同一标签额值有好几个,问题来了,如何规定id的值唯一,或者是元素只能出现一次,不能出现多次,或者在指定的标签内出现元素名字?
DTD 约束
语法自成一派,出现的早,可读性差。
schema
语法就是xml的语法规则, 解析起来方便。schema是代替DTD而出现的,但是scheme阅读行较差,所以没有完全替代DTD。

DTD的引入方式
1 网络引入
2 本地引入
3 直接在xml 里面潜入DTD 的规则约束

<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入dtd -->

<!-- <!DOCTYPE stus PUBLIC "//UNKNOWN/" "unknown.dtd"> --><!--第一种方式通过网络引入  -->
<!-- <!DOCTYPE stus SYSTEM "stus.dtd"> --><!-- 第二种方式通过本地引入dtd -->
<!-- 第三种,直接文件内引入 -->
<!DOCTYPE stus[
<!ELEMENT stus (stu)>
<!ELEMENT stu (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
<stus>
	<stu>
		<name > 张三 </name>
		<age>18</age>
	</stu>
</stus>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值