xml文档解析
* xml文档是用来存放数据 这些数据需要被程序传递并使用
* 但xml语法有别于使用它的语言的语法(如: java),所以需要根据java语法及xml文档规则,
* 将xml存储的数据转换成想使用它的语言 能使用的数据 这种过程就叫 xml文档解析
* 应用: 因为xml文档在各语言基础定义一致 且解析逻辑一致 顾用于各语言之间进行数据传输
*
* xml 常用解析规则
* Dom Document Object Model 是面向文档结构树的对象模型
* (DOM是将整个xml加载到内存再读取,如果xml特别大,会影响系统新能,适用于解析小文件xml,可以读取任意位置节点)
*
* 优点: 可以清晰的展示节点的层次关系 节点之间的联代关系
* 具有强大的节点操作功能
* 缺点: 该方式会将整个文档解析的DOM树 整体存在内存中 不利于XML
* 大文档型操作
*
* SAX Simple API for XML
* 原理: SAX是面向文档接口的逻辑(推)模型解析
* 优点: 具有快速处理XML文档的能力 节约内存(根据需求进行必要的局部解析 且前后解析具有很大的灵活性)
* 缺点: 无法标注节点之间的层次关系 节点功能操作获取途径单一化
* Dom4j
* 特点: 整合各语法解析优点 具有灵活的DOM文档树的内存印象解析
* (把整个树的数据存放在内存中 而不是整个文档 通过SAX面向接口 获取方法去调用)
*/
dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它.
对主流的Java XML API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。
使用Dom4j开发,需下载dom4j相应的jar文件
一. 获取xml文档
// 1. 通过SAXReader() 空控制器 生成操作XML的输入流
SAXReader reader = new SAXReader();
// 2. 通过操作时(读取动作),再于文件或流建立起直接关系
// 获取文档
// 先创建文件的File实例对象
File file = new File(Files.getPath(Files.d_s,"lesson","xml"), "School.xml");
// 获取Document的对象
Document document = reader.read(file);
二. 数据相关操作
// 2.获取文档的跟节点
Element element = document.getRootElement();
Element root = document.getRootElement();
// 3. 获取节点内容(String类型)
String string = root.getTextTrim();
System.out.println(string);
// 4. 获取节点属性
Attribute att = root.attribute("value");
System.out.println(att.getText());
// 5. 获取节点属性值
// 一一对象关系 map
String key = att.getName();
String value = att.getValue();
System.out.println(key + "-" + value);
// 6. 获取子节点
List<Element> list = root.elements();
for (Element element : list) {
// 7. 获取子节点的名字
System.out.println(element.getName());
}
// 8. 获取指定子节点
Element stus = root.element("Students");
System.out.println(stus);
// 9. 获取父节点
Element parent = stus.getParent();
System.out.println(parent);
举个例子 看下代码 附XML文件
// 怎么去获取节点下的所有子节点
// 遍历
// 获取其子节点
// 老师们
Element teas = element.element("Teachers");
// 学生们
Element stus = element.element("Students");
// 获取老师们下的子节点
List<Element> tea = teas.elements();
// 对老师们的所有子节点遍历
for (Element ele : tea) {
List<Element> list = ele.elements();
System.out.println(ele.attribute("id").getText());
for (Element element2 : list) {
System.out.println(element2.getName()+ "--" + element2.getText());
}
}
// 获取学生们的子节点
List<Element> stu = stus.elements();
for (Element ele : stu) {
System.out.println(ele.attribute("num").getText());
List<Element> e = ele.elements();
for (Element element2 : e) {
System.out.println(element2.getName() + "--" + element2.getTextTrim());
}
}
School XML文件
<?xml version="1.0" encoding="UTF-8"?>
<School value="老师+学生">
<!--
CDATA语法:该语法规定语法内的文字为XML语法不解析内容
CDATA内的文字为纯文本
-->
<![CDATA[
<省重点>民办高级小学生聚集地
]]>
学校
<Teachers name="老师">
<Teacher id="10000">
<name>王大锤</name>
<gender>男</gender>
<subject>艺术</subject>
<salary>800/天</salary>
</Teacher>
<Teacher id="10086">
<name>毕小索</name>
<gender>男</gender>
<subject>美术</subject>
<salary>500/天</salary>
</Teacher>
<Teacher id="10010">
<name>苍肖锋</name>
<gender>女</gender>
<subject>生物</subject>
<salary>1000/天</salary>
</Teacher>
</Teachers>
<Students name="学生">
<Student num="001">
<name>王尼玛</name>
<gender>男</gender>
<class>一班</class>
</Student>
<Student num="002">
<name>康师傅</name>
<gender>女</gender>
<class>三班</class>
</Student>
<Student num="003">
<name>张全蛋</name>
<gender>男</gender>
<class>二班</class>
</Student>
<Student num="004">
<name>马小璐</name>
<gender>女</gender>
<class>八班</class>
</Student>
</Students>
</School>