《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.2 解析XML文档

本文涉及的产品
云解析DNS,个人版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 本节书摘来华章计算机《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一书中的第3章 ,第3.2节,[美] 凯S.霍斯特曼(Cay S. Horstmann) 著陈昊鹏 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.2 解析XML文档

要处理XML文档,就要先解析(parse)它。解析器是这样一个程序:它读入一个文件,确认这个文件具有正确的格式,然后将其分解成各种元素,使得程序员能够访问这些元素。Java库提供了两种XML解析器:

  • 像文档对象模型(Document Object Model, DOM)解析器这样的树型解析器(tree parser),它们将读入的XML文档转换成树结构。
  • 像XML简单API(Simple API for XML, SAX)解析器这样的流机制解析器(streaming parser),它们在读入XML文档时生成相应的事件。

DOM解析器对于实现我们的大多数目的来说都更容易一些,所以我们首先介绍它。如果你要处理很长的文档,用它生成树结构将会消耗大量内存,或者如果你只是对于某些元素感兴趣,而不关心它们的上下文,那么在这些情况下你应该考虑使用流机制解析器。更多的信息可以查看3.6节。
DOM解析器的接口已经被W3C标准化了。org.w3c.dom包中包含了这些接口类型的定义,比如:Document和Element等。不同的提供者,比如Apache组织和IBM,都编写了实现这些接口的DOM解析器。Java XML处理API (Java API for XML Processing, JAXP)库使得我们实际上可以以插件形式使用这些解析器中的任意一个。但是JDK中也包含了从Apache解析器导出的DOM解析器。
要读入一个XML文档,首先需要一个DocumentBuilder对象,可以从DocumentBuilder Factory中得到这个对象,例如:
image

注意:如果使用输入流作为输入源,那么对于那些以该文档的位置为相对路径而被引用的文档,解析器将无法定位,比如在同一个目录中的DTD。但是,可以通过安装一个“实体解析器”(entity resolver)来解决这个问题。请查看www.xml.com/pub/a/2004/03/03/catalogs.html或www.ibm.com/developerworks/xml/library/x-mxd3.html,以了解更多信息。
Document对象是XML文档的树型结构在内存中的表示方式,它由实现了Node接口及其各种子接口的类的对象构成。图3-1显示了各个子接口的层次结构。

image

可以通过调用getDocumentElement方法来启动对文档内容的分析,它将返回根元素。
image

那么,调用getDocumentElement方法可以返回font元素。getTagName方法可以返回元素的标签名。在前面这个例子中,root.getTagName()返回字符串"font"。
如果要得到该元素的子元素(可能是子元素、文本、注释或其他节点),请使用getChildNodes方法,这个方法会返回一个类型为NodeList的集合。这个类型在标准的Java集合类创建之前就已经被标准化了,因此它具有一种不同的访问协议;item方法将得到指定索引值的项;getLength方法则提供了项的总数。因此,我们可以像下面这样枚举所有子元素:
image

图3-2显示了其DOM树。
image

如果只希望得到子元素,那么可以忽略空白字符:
image
image

现在,只会看到两个元素,它们的标签名是name和size。
正如将在下一节中所看到的那样,如果你的文档有DTD,那么你就可以做得更好。这时,解析器知道哪些元素没有文本节点的子元素,而且它会帮你剔除空白字符。
在分析name和size元素时,你肯定想获取它们包含的文本字符串。这些文本字符串本身都包含在Text类型的子节点中。既然知道了这些Text节点是唯一的子元素,就可以用getFirstChild方法而不用再遍历另一个NodeList。然后可以用getData方法获取存储在Text节点中的字符串。
image

提示:对getData的返回值调用trim方法是个好主意。如果XML文件的作者将起始和结束的标签放在不同的行上,例如:
image

那么,解析器将会把所有的换行符和空格都包含到文本节点中去。调用trim方法可以把位于实际数据前后的空白字符删掉。
也可以用getLastChild方法得到最后一项子元素,用getNextSibling得到下一个兄弟节点。这样,另一种遍历子节点集的方法就是:
image

如果要枚举节点的属性,可以调用getAttributes方法。它返回一个NamedNodeMap对象,其中包含了描述属性的Node对象。可以用和遍历NodeList一样的方式在NamedNodeMap中遍历各子节点。然后,调用getNodeName和getNodeValue方法可以得到属性名和属性值。
image

或者,如果知道属性名,则可以直接获取相应的属性值:
image

现在你已经知道怎么分析DOM树了。程序清单3-1中的程序将这些技术都运用了一遍。你可以使用File -> Open菜单选项来读入一个XML文件。DocumentBuilder对象会解析这个XML文件,并产生一个Document对象。该程序会将Document对象显示为一个JTree(参见图3-3)。
image

该树形结构清楚地显示了子元素是怎样被包含空白字符和注释的文本包围起来的。为了更清楚起见,这个程序将换行和回车字符显示为n和r。(否则,它们将显示为空框,这是Swing对字符串中不能绘制的字符显示的默认符号)。
在第10章你将会学习到该程序中用来显示树形结构和属性表的技术。DOMTreeModel类实现了TreeModel接口。getRoot方法会返回文档的根元素,getChild方法可以得到子元素的节点列表,返回被请求的索引值对应的项。表的单元格渲染器显示了以下内容:

  • 对元素,显示的是元素标签名和由所有的属性构成的一张表。
  • 对字符数据,显示的是接口(Text、Comment、CDATASection),后面跟着数据,其中换行和回车字符被n和r取代。
  • 对其他所有的节点类型,显示的是类名,后面跟着toString的结果。

程序清单3-1 dom/Treeviewer.java
image
image
image
image
image
image
image
image
image
image
image
image
image

相关文章
|
1天前
|
XML Web App开发 JavaScript
XML DOM 解析器
Most browsers have a built-in XML parser that converts XML into a JavaScript accessible object (XML DOM).
|
1天前
|
XML Web App开发 JavaScript
XML DOM 解析器
解析器把 XML 转换为 JavaScript 可存取的对象(XML DOM)。
|
3天前
|
安全 Java 数据处理
Java并发编程:线程同步与协作的深度解析
在探索Java并发编程的海洋中,线程同步与协作的灯塔指引着航向。本文将深入挖掘线程同步机制的核心原理,揭示锁、条件变量等工具如何确保数据的一致性和线程间有序的通信。通过案例分析,我们将解码高效并发模式背后的设计哲学,并探讨现代Java并发库如何简化复杂的同步任务。跟随文章的步伐,您将获得提升多线程应用性能与可靠性的关键技能。 【7月更文挑战第24天】
17 5
|
4天前
|
缓存 安全 算法
Java内存模型深度解析与实践应用
本文深入探讨Java内存模型(JMM)的核心原理,揭示其在并发编程中的关键作用。通过分析内存屏障、happens-before原则及线程间的通信机制,阐释了JMM如何确保跨线程操作的有序性和可见性。同时,结合实例代码,展示了在高并发场景下如何有效利用JMM进行优化,避免常见的并发问题,如数据竞争和内存泄漏。文章还讨论了JVM的垃圾回收机制,以及它对应用程序性能的影响,提供了针对性的调优建议。最后,总结了JMM的最佳实践,旨在帮助开发人员构建更高效、稳定的Java应用。
|
4天前
|
安全 Java 编译器
Java内存模型深度解析
【7月更文挑战第23天】在探索Java的高效与稳定性之谜时,我们不可避免地要深入其核心——Java内存模型(JMM)。本文将揭开JMM的神秘面纱,从基本概念到底层实现机制,再到并发编程中的应用实践,全面剖析这一确保Java程序正确性的基石。通过理解JMM的设计哲学和运作原理,开发者能够更好地编写出既高效又线程安全的代码,避免那些隐藏在多线程环境下的陷阱。
|
4天前
|
XML Web App开发 JavaScript
XML DOM 解析器
大多数浏览器内置XML解析器,将XML转化为JavaScript可访问的XML DOM对象。XML DOM提供遍历、访问、插入和删除节点的功能。文档须先加载至DOM。示例代码通过XMLHTTP请求加载`books.xml`,兼容多种浏览器,响应设置为XML DOM用于后续处理。
|
4天前
|
XML Web App开发 JavaScript
XML DOM 解析器
**XML DOM解析器将XML转换为JS对象,便于操作。浏览器内置XML解析器,通过XMLHttpRequest或ActiveXObject加载XML如"books.xml"。
|
2天前
|
存储 监控 算法
Java中的垃圾回收机制深度解析
在Java的内存管理中,垃圾回收机制(Garbage Collection, GC)扮演着至关重要的角色。本文将深入探讨Java垃圾回收的工作原理、常见的垃圾回收算法以及调优策略,旨在帮助开发者更好地理解和掌握这一核心机制,进而优化Java应用的性能表现。
13 0
|
2天前
|
XML Web App开发 JavaScript
XML DOM 解析器
Most browsers have a built-in XML parser to create an XML DOM object from XML, making it accessible via JavaScript. The XML DOM includes methods for navigating, accessing, inserting, and deleting nodes in the XML tree.
|
7天前
|
XML Web App开发 JavaScript
XML DOM 解析器
**XML DOM解析器**在浏览器中内置,将XML转换为可操作的对象。通过遍历、访问和修改节点来处理XML。首先,XML文档加载到DOM对象,如JavaScript的`responseXML`属性所示。

推荐镜像

更多