深入解析XML文档解析工具及其在Java中的应用

佚名
2024-12-19
来源:网络整理

XML 这种数据交换格式很神奇,在各类系统中都广泛地被应用。然而它有很多种解析的方式,就好像有很多把打开宝库的钥匙一样。那我们到底该怎么去选择?这确实是一件让人很头疼的事情。

<4ab3bf5809e13f47640de74292792e2d>XML的底层逻辑与价值

e><code class="prism language-xml">


<site> <name>CSDN博客网站name> <url>https://blog.csdn.net/url> <desc>技术学习网站desc> site>

XML 文档的定义很清晰,它可以清晰地标记和定义数据类型。因为这个原因,它在数据交互领域有着重要地位。在实际开发中,尤其是在跨平台、跨语言的数据交换场景里,它的重要性就显现出来了。比如,在一些大型互联网企业的不同部门之间,存在着用多种语言编写的程序,而 XML 就成为了通用的数据交换语言。并且它很灵活,能够自定义标记语言来承载数据,正是这种特性让很多开发者喜欢它。

XML 文档遵循简单的语法规则。这些规则能够确保数据的统一和准确。很多项目因为它的这种特质才得以有序进行。


DOM 解析 SAX 解析 JDOM 解析 DOM4J 解析

Java与XML


<class> <student id="1"> <name>张三name> <gender>gender> <age>26age> student> <student id="2"> <name>里斯name> <gender>gender> <age>36age> student> <student id="3"> <name>王五name> <gender>gender> <age>24age> student> class>

在 Java 程序里,XML 解析是比较常见的需求。因为 Java 在企业级开发等很多领域都有广泛应用。各种不同功能的 Java 程序都有可能会和 XML 打交道。像在 Java 编写的后端程序中,XML 可能会被用在配置文件里。对于 Java 开发者来说,如果不理解 Java 怎样解析 XML,在工作中就会经常遇到困难。并且不同的 Java 程序对 XML 解析方式的选择也不一样,这些都需要根据具体情况来权衡。

DOM解析的优劣


1.能快速遍历 XML 中任意节点数据,同时允许应用程序对数据和结构做出更改 2.可以在任何时候在树中上下导航,获取和操作任意部分的数据


加载数据量比较小的 XML 文档问题不大,加载大的 XML 文档,内存消耗会很大,有内存溢出的风险

DOM 解析的地位很重要,属于元老级别。它的优点是很方便,代码编程也简单。在开发周期紧张的小项目中,如果不依靠第三方包,DOM 解析能节省时间,比如一些小型 web 应用的简易配置文件解析。不过它也有明显的不足,在进行 DOM 解析时,整个文档都需要加载到内存中构建层次结构。当处理大型 XML 文件时,这就会很吃力,想象一下,如果大型 XML 文件有上万个节点,内存很可能会被撑爆。


import org.w3c.dom.*; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.InputStream; public class DomDemo { public static void main(String[] args) { // 1.获取xml文件流 InputStream inputStream = DomDemo.class.getClassLoader().getResourceAsStream("demo.xml"); // 2.创建DocumentBuilderFactory对象 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 3.创建DocumentBuilder对象 try { DocumentBuilder builder = factory.newDocumentBuilder(); Document d = builder.parse(inputStream); NodeList stdList = d.getElementsByTagName("student"); for (int i = 0; i <stdList.getLength() ; i++) { Node std = stdList.item(i); // 遍历标签属性 NamedNodeMap attrs = std.getAttributes(); for(int j=0; j< attrs.getLength(); j++){ Node attr = attrs.item(j); System.out.println(attr.getNodeName()+":"+attr.getNodeValue()); } // 遍历标签子节点 NodeList childNodes = std.getChildNodes(); for (int k = 0; k <childNodes.getLength() ; k++) { if (childNodes.item(k).getNodeType()== Node.ELEMENT_NODE) { System.out.println(childNodes.item(k).getNodeName() + ":" + childNodes.item(k).getTextContent()); } } System.out.println("=============="); } } catch (Exception e) { e.printStackTrace(); } } }

SAX解析的利与弊


1.采用事件驱动模式一段一段的来解析数据,占用内存小 2.只在读取数据时检查数据,不需要保存在内存中 3.效率和性能较高,能解析大于系统内存的文档

DOM 和 SAX 相比,SAX 更明智。处理大型 XML 文件时,它占内存小的优势能立刻显现出来。不管 XML 文件有多大,它每次都只在内存中加载一小部分,所以基本上不用担心内存溢出。不过它也有缺陷,SAX 解析的代码不太容易写。对于新手开发者而言,入手的难度比 DOM 大很多,必须对 SAX 的工作原理和各种事件有很透彻的理解才能驾驭它。


1.DOM 解析器相比,使用 SAX 解析器读取 XML 文件时,解析逻辑比较复杂 2.同时无法定位文档层次,很难同时访问同一文档的不同部分数据,不支持 XPath

JDOM解析的特色


import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import java.io.InputStream; import java.util.List; import java.util.Map; public class SAXDemo { public static void main(String[] args) throws Exception { // 1.获取xml文件流 InputStream inputStream = SAXDemo.class.getClassLoader().getResourceAsStream("demo.xml"); // 2.获取SAXParserFactory实例 SAXParserFactory factory = SAXParserFactory.newInstance(); // 3.获取SAXparser实例 SAXParser saxParser = factory.newSAXParser(); // 4.创建Handel对象 SAXDemoHandel handel = new SAXDemoHandel(); // 5.解析XML文件 saxParser.parse(inputStream, handel); // 6.获取读取结果 List<Map<String, String>> students = handel.getStudents(); for (Map<String, String> student : students) { System.out.println(student.toString()); } } }

JDOM 在 DOM 和 SAX 之间达成了平衡。它把 DOM 和 SAX 在实际中的缺点给弥补了。要是解析的 XML 文件不是特别巨大,但是结构比较复杂的话,JDOM 就能表现得很出色。不过因为它比较新,并且是一种折中的选择,所以在一些比较传统保守的项目里,可能没有 DOM 和 SAX 那样被接受度高。毕竟很多老项目更愿意选择比较成熟的技术方案。


import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class SAXDemoHandel extends DefaultHandler { private String value; private Map<String, String> student; private List<Map<String, String>> students = new ArrayList<>(); public List<Map<String, String>> getStudents() { return students; } /** * xml 解析开始 * @throws SAXException */ @Override public void startDocument() throws SAXException { super.startDocument(); System.out.println("xml 解析开始"); } /** * xml 解析结束 * @throws SAXException */ @Override public void endDocument() throws SAXException { super.endDocument(); System.out.println("xml 解析结束"); } /** * 解析 XML 元素开始 * @param uri * @param localName * @param qName * @param attributes * @throws SAXException */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); System.out.println("开始遍历节点:" + qName); if (qName.equals("student")){ student = new HashMap<>(); for(int i=0; i<attributes.getLength();i++){ student.put(attributes.getQName(i), attributes.getValue(i)); } } } /** * 解析 XML 元素结束 * @param uri * @param localName * @param qName * @throws SAXException */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); System.out.println("节点遍历结束:" + qName); if(qName.equals("student")){ students.add(student); student = null; } else if(qName.equals("name") || qName.equals("gender") || qName.equals("age")){ student.put(qName, value); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); // 获取节点值数组 value = new String(ch,start,length).trim(); if (!value.equals("")) { System.out.println(value); } } }


{gender=, name=张三, id=1} {gender=, name=里斯, id=2} {gender=, name=王五, id=3}

DOM4J解析的优势

DOM4J 是 JDOM 的升级版。从开源项目对它的采用量能看出它很优秀。知名框架会利用它来读取 XML 配置文件。实际应用时,只要没有特殊限制,它就是 XML 解析的首选工具。它性能良好,能高效解析 XML 文件,在代码编写复杂度上也适中,资深和中级开发者都能较好地掌握它。


1.基于树的模型处理 XML 文件,数据会加载在内存中 2.没有向下兼容的限制,因此比 DOM 简单 3.速度快,缺陷少 4.具有 SAX 的解析特征 5.APIDOM 更容易理解

那么问题出现。在你的项目当中,如果需要对 XML 进行解析,你最先会考虑哪种解析工具?希望大家能够评论、点赞并且分享这篇文章。


1.不能处理大于内存的 XML 文档 2.不支持与 DOM 中相应遍历包

咪酷科技-一站式企业数字化服务 www.mkpyw.com

阅读105
分享