1.为什么要学XML解析:

我们在学习框架的时候应该都会接触大量的xml配置文件,而框架正是通过解析XML文件来获取我们在xml中所配置的内容的,因此了解怎么解析XML也可以使你更接近框架底层一些:
接下来我们来学习一下如何来解析一个XML文件。

2.市面上常见的XML解析技术

其实解析XML文件是一件非常简单的事情,我们需要先了解一下市面上常用的xml解析技术:

(1)DOM解析:

DOM
DOM的全称是 Document Object Model,即文档对象模型,W3C 组织推荐处理 XML 的一种方式。在应用程序中,基于 DOM 的 XML 分析器将一个 XML 文档转换成一个对象模型的集合(通常称 DOM 树),应用程序正是通过对这个对象模型的操作,来实现对 XML 文档数据的操作。通过 DOM 接口,应用程序可以在任何时候访问 XML 文档中的任何一部分数据,因此这种利用 DOM 接口的机制也被称作随机访问机制。
DOM 接口提供了一种通过分层对象模型来访问 XML 文档信息的方式,这些分层对象模型依据 XML 的文档结构形成了一棵节点树。无论 XML 文档中所描述的是什么类型的信息,即便是制表数据、项目列表或一个文档,利用 DOM 所生成的模型都是节点树的形式。也就是说 DOM 强制使用树模型来访问 XML 文档中的信息。由于 XML 本质上就是一种分层结构,所以这种描述方法是相当有效的。
DOM 树所提供的随机访问方式给应用程序的开发带来了很大的灵活性,它可以任意地控制整个 XML 文档中的内容。然而,由于 DOM 分析器把整个 XML 文档转化成 DOM 树放在了内存中,因此当文档比较大或者结构比较复杂时,对内存的需求就比较高。而且对于结构复杂的树的遍历也是一项耗时的操作。所以 DOM 分析器对机器性能的要求比较高,实现效率不十分理想。不过,由于 DOM 分析器所采用的树结构的思想与 XML 文档的结构相吻合,同时鉴于随机访问所带来的方便,因此 DOM 分析器还是有很广泛的使用价值的。

(2)SAX解析技术

SAX 的全称是 Simple APIs for XML,即 XML 简单应用程序接口。与 DOM 不同,SAX 提供的访问模式是一种顺序模式,这是一种快速读写 XML 数据的方式。当使用 SAX 分析器对 XML 文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对 XML 文档的访问,因而 SAX 接口也被称作事件驱动接口。SAX 不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。
[

](https://blog.csdn.net/valada/article/details/79910055)

(3)dom4j解析技术

虽然 DOM4J 代表了完全独立的开发结果,但最初它是 JDOM 的一种智能分支。它合并了许多超出基本 XML 文档表示的功能,包括集成的 XPath 支持、 XML Schema 支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,它通过 DOM4J API 和标准 DOM 接口具有并行访问功能。
为支持所有这些功能,DOM4J 使用接口和抽象基本类方法。DOM4J 大量使用了 API 中的 Collections 类,但是在许多情况下,它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是,虽然 DOM4J 付出了更复杂的 API 的代价,但是它提供了比 JDOM 大得多的灵活性。在添加灵活性、XPath 集成和对大文档处理的目标时,DOM4J 的目标与 JDOM 是一样的:针对 Java 开发者的易用性和直观操作。它还致力于成为比 JDOM 更完整的解决方案,实现在本质上处理所有 Java/XML 问题的目标。在完成该目标时,它比 JDOM 更少强调防止不正确的应用程序行为。
DOM4J 是一个非常非常优秀的 Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML,特别值得一提的是 Sun 的 JAXM 也在用 DOM4J。同时需要注意的是 DOM4J 目前也分为两个版本,分别为 DOM4J 1.x和 DOM4J 2.x。
其特征主要有:
JDOM 的一种智能分支,它合并了许多超出基本 XML 文档表示的功能。
它使用接口和抽象基本类方法。
具有性能优异、灵活性好、功能强大和极端易用的特点。
是一个开放源码的文件。


3.实战解析

接下来我们就用dom4j解析技术来完成这项伟大的工作吧:
1.首先我们需要创建一个XML文件,注意:一个XML文件必须要有一个根节点:类似于html页面中的标签。然后我们需要给这个xml文件填充上内容:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Students>
  3. <student id="1001">
  4. <name>xiaoqi</name>
  5. <age>12</age>
  6. </student>
  7. <student id="1002">
  8. <name>王佳乐</name>
  9. <age>13</age>
  10. </student>
  11. <student id="1003">
  12. <name>李鹏</name>
  13. <age>12</age>
  14. </student>
  15. </Students>

2.然后我们需要在maven配置文件中导入dom4j的依赖

  1. <dependency>
  2. <groupId>dom4j</groupId>
  3. <artifactId>dom4j</artifactId>
  4. <version>1.6.1</version>
  5. </dependency>

3.我们需要创建一个普通的java类,接下来就开始真正的xml解析把!
我们需要创建一个SAXReader类的对象,使用这个对象中的read()方法,将我们写的XML文件读入进来,记住在IDEA工具中,单元测试模块和main方法的读取文件的路径是不一样的
在单元测试模块中:文件的路径是以当前模块的src目录开始算的
在main方法中:文件的路径是从当前项目开始算的
例如我的xml文件放在这个位置
图片.png
那么我在main方法中读取这个xml文件就是:如下

  1. read = saxReader.read("XMLParse/src/main/java/student.xml");

那么我在单元测试方法中读取

  1. read = saxReader.read("src/main/java/student.xml");

接下来,当我们要解析一个XML文件时,我们第一步需要先读取到这个xml文件,然后必须要先读它的根节点,通过它的根节点,才能读取到下边的标签内容
我们需要使用读取到的对象调用一个getRootElement()方法来获取到根节点:

  1. // 2.通过Document对象获取根元素
  2. Element rootElement = read.getRootElement();
  3. System.out.println(rootElement);

当我们获取到了根节点之后,就想怎么玩就怎么玩了,这里介绍几个常用的方法
element()方法:通过指定标签元素获取到xml中这个标签以及值,
elements()方法:可以获取到xml文件中所有的元素节点。
getText()方法:获取到指定标签的内容
asXML()方法:把标签对象转换为标签字符串
elementText(“age”):获取指定标签中的内容
attributeValue(“id”):获取指定属性的值
ele.attributes();获取所有的属性
对上述xml文件的完整解析:

  1. public class Dom4jTest {
  2. public static void main(String[] args) {
  3. SAXReader saxReader = new SAXReader();
  4. Document read = null;
  5. try {
  6. // // main测试中相对路径从当前项目开始算
  7. read = saxReader.read("XMLParse/src/main/java/student.xml");
  8. System.out.println(read);
  9. } catch (DocumentException e) {
  10. e.printStackTrace();
  11. }
  12. }
  13. @Test
  14. public void test1() {
  15. SAXReader saxReader = new SAXReader();
  16. Document read = null;
  17. try {
  18. // 1.读取student.xml文件(在JUint测试中,相对路径从模块名开始算)
  19. read = saxReader.read("src/main/java/student.xml");
  20. System.out.println(read);
  21. // 2.通过Document对象获取根元素
  22. Element rootElement = read.getRootElement();
  23. System.out.println(rootElement);
  24. // 3.通过根元素获取book标签对象
  25. Element age1 = rootElement.element("age");
  26. List<Element> elements = rootElement.elements();
  27. // 4.遍历处理每个book标签转换为Book类
  28. for (Element ele:elements) {
  29. // asXML把标签对象转换为标签字符串
  30. System.out.println(ele.asXML());
  31. Element name = ele.element("name");
  32. String s = name.asXML();
  33. System.out.println(s);
  34. // 遍历所有文本属性为name的内容
  35. String text = name.getText();
  36. System.out.println(text);
  37. // 获取指定标签中的内容
  38. String age = ele.elementText("age");
  39. System.out.println(age);
  40. // 获取指定属性的值
  41. String id = ele.attributeValue("id");
  42. System.out.println(id);
  43. // 获取所有的属性
  44. List attributes = ele.attributes();
  45. // [Attribute: name id value "1002"]]
  46. System.out.println(attributes);
  47. new Student(text,Integer.valueOf(age));
  48. }
  49. } catch (DocumentException e) {
  50. e.printStackTrace();
  51. }
  52. }
  53. }

以上就是基本的XML解析技术,如果还想了解更多请滴滴作者!