Java库提供了两种XML解析器
(1)文档对象模型(Document Object Model, DOM)解析器,树形解析器(tree parser),将读入的XML转换成树形结构。
(2)用于XML的简单API(Simple API for XML,SAX)解析器,流机制解析器(streaming parser),在读入XML文档时生成相应的事件。
1.DOM解析器
当处理大文档时,树结构将会消耗大量内存,或只针对于某些元素时,应选用流机制解析器(SAX)。
在开始解析之前,可以设置Crimson(默认,sun)或Xerces(IBM,classpath中要有xerces.jar(其中包含了sax dom jaxp )和 xercesImpl.jar)
System.setProperty("javax.xml.parsers.DocumentBuilderFactory","org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
(1)读入一个XML文档,需要一个DocumentBuilder对象,可以从DocumentBuilderFactory中得到这个对象。
javax.xml.parsers.DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); javax.xml.parsers.DocumentBuilder builder = factory.newDocumentBuilder();
(2)读入文档 org.w3c.dom.Document
org.w3c.dom.Document doc = builder.parse(file);
或者用URL
org.w3c.dom.Document doc = builder.parse(url);
或使用一个任意的输入流
org.w3c.dom.Document doc = builder.parse(inputStream);
注意:如果使用输入流,那么对于通过相对于文档的位置关系来引用的文件,解析器将无法定位,比如在同一个目录中的DTD。但是可以通过安装一个 实体分解器(entity resolver) 来解决这个问题。
(3)Document对象是XML文档的树型结构在内存中的表现,它由实现Node接口及其多个子接口的类的对象构成。可以通过调用getDocumentElement方法来分析文档的内容,它将返回root element(根元素)。
org.w3c.dom.Element root = doc.getDocumentElement();
(4)要得到该元素的下一个节点(子元素、文本、注释或其他节点),使用getChildNodes方法。这个方法返回一个类型为NodeList的集合。NodeList集合
NodeList在标准Java集合类创建之前就建立了,与标准Java集合类访问协议不同。item方法得到指定索引号的项,getLength方法返回项的总数。
e.g.枚举所有子元素
org.w3c.dom.NodeList childNodes = roog.getChildNodes(); for(int i=0;i<childNodes.getLength();i++){ org.w3c.dom.Node childNode = childNodes.item(); }
注意:子元素会比期望值高
<font> <name>Helvetica</name> <size>36</size> </font>
font会有5个子节点,而不是期望中的2个。<font>和<name>之间的空格,name元素,</name>和<size>之间的空白字符,size元素,</size>和</font>之间的空白字符。
如果只希望得到子元素,需要忽略空白字符
for(int i=0;i<childNodes.getLength();i++){ Node child = childNodes.item(i); if(child instanceof Element){ Element childElement = (Element)child; } }
如果有DTD,解析器就可以知道哪些元素没有文本节点的子元素,而且会帮助禁止掉空白字符。
(5)分析子元素所包含的文本字符串org.w3c.dom.Text,比如上例中的name和size。这些文本字符串本身都包含在Text类型的子节点中。因为Text类型是唯一的子元素,可以用getFirstChild方法,而不用遍历一个NodeList。然后用getData方法检索存储在Text节点中的字符串。
NodeList childNodes = root.getChildNodes(); for(int i=0;i<childNodes.getLength();i++){ Node child = childNodes.item(i); if(child instanceof Element){ Element childElement = (Element)child; Text textNode = (Text)childElement.getFirstChild(); String text = textNode.getData().trim(); if("name".equals(childElement.getTagName())){ name = text; }else if("size".equals(childElement.getTagName())){ size = text; } } }
对getData方法的返回值调用trim方法。因为起始和结束标签可能不在同一行上,导致空白字符
也可以用getLastChild方法得到最后一项子元素
Document doc = builder.parse(xml); Element root = doc.getDocumentElement(); for(Node childNode = root.getFirstChild();childNode !=null;childNode = childNode.getNextSibling()){ if(childNode instanceof Element){ Text textNode = (Text)childNode.getLastChild(); String text = textNode.getData(); } }
(6)枚举节点的属性,通过调用Node的getAttributes方法,如果节点是Element返回NamedNodeMap,否则返回null。
if(childNode instanceof Element){ NamedNodeMap attributes = childNode.getAttributes(); for(int i=0;i<attributes.getLength();i++){ Node attribute = attributes.item(i); String name = attribute.getNodeName(); String value = attribute.getNodeValue(); System.out.println(); } }
或者根据已知的属性名,得到通过Element的getAttribute(String name) 来获得属性,如果没有指定值或默认值,则返回空字符串。
if(childNode instanceof Element){ Element childElement = (Element)childNode; String value = childElement.getAttribute("unit"); System.out.println(value); }
相关推荐
xmlparse.c文件包含了解析XML文档的主要实现代码。它通常会通过读取XML文档的字节流,逐步构建XML元素树。解析过程包括词法分析(Tokenization)、语法分析(Parsing)和语义分析(Semantic Analysis)。词法分析将...
在C++中,解析XML文档或XML字符串是常见的任务,特别是在需要与JavaScript或其他不支持指针的语言交互时。本文将详细介绍如何在Visual Studio 2010环境下利用Microsoft的MSXML库来处理XML数据。 首先,让我们看看...
在QT中解析XML文档主要依赖于QDomDocument类和相关的辅助类,如QDomElement、QDomNode等。XML(eXtensible Markup Language)是一种结构化数据格式,常用于存储和传输数据。 XML文档由一系列元素组成,每个元素都有...
本主题将深入探讨如何在Servlet中利用SAX解析XML文档。 首先,我们需要了解SAX解析的基本原理。SAX解析器不创建整个XML文档树,而是当遇到XML文档的各个部分(如元素、属性、文本等)时,触发相应的事件回调函数。...
本篇将详细讲解如何在VC++中使用MSXML库解析XML文档,以"CHINAmap2008"为例。 首先,我们需要理解MSXML,它是Microsoft XML Core Services的缩写,提供了C++和COM接口来处理XML文档。MSXML包括几个主要组件,如DOM...
本示例将详细解释如何在Java中使用SAX解析XML文档,并通过注释进行详细说明。 首先,我们需要引入SAX解析器的依赖库,通常这可以通过在项目构建配置中添加JAXB或Xerces实现来实现。 ```java // 引入必要的库,如...
二、使用 DOM 解析 XML 文档 使用 DOM 解析 XML 文档需要以下步骤: 1. 创建 DocumentBuilderFactory 对象,用于创建 DocumentBuilder 对象。 2. 使用 DocumentBuilder 对象解析 XML 文档,获取 Document 对象。 3...
3. **解析XML**:调用`parse`方法,传入XML文件的输入流或URL,开始解析过程。 **SAX解析XML的关键事件处理:** 1. **startDocument()**:开始解析文档时触发。 2. **startElement()**:遇到开始标签时触发,提供...
Java提供了多种解析XML的API,包括SAX(Simple API for XML)、DOM(Document Object Model)以及DOM4J。下面我们将详细探讨这些解析方式及其在实际开发中的应用。 1. SAX解析器: SAX是一种基于事件驱动的解析器,...
在Java编程中,解析XML文档是一项常见的任务,用于读取和操作XML文件中的数据。XML(eXtensible Markup Language)是一种标记语言,常用于存储和传输数据,尤其是在Web服务和配置文件中。本篇文章将深入探讨四种主流...
5. **解析XML文档**:使用`xml_parse()`函数开始解析XML数据。这个过程会逐行处理XML文档,返回XML元素的节点结构。 6. **处理XML节点**:在解析过程中,通过回调函数处理每个元素节点,提取元素名、属性和文本内容...
XMLParse 是一个基于VC++(Visual C++)的XML解析类,用于处理和解析XML文档。XML(eXtensible Markup Language)是一种标记语言,常用于数据交换、配置存储等,因为它具有良好的结构化和可读性。XMLParse类可能包含...
`ParseXML`类的实例`p1`用于解析XML文件,其`parse()`方法接收XML文件路径作为参数。在解析完成后,`Processor`对象`proc`被创建,并调用`displayEnergy()`显示特定级别的能量信息。最后,`ParseXML`对象被删除,...
5. **解析XML**:最后,使用配置好的 Digester 对象解析XML文件: ```java Root root = null; try (InputStream is = new FileInputStream("path_to_xml_file.xml")) { root = digester.parse(is); } catch ...
Java SAX方式解析XML文档是一种高效的处理大型XML文件的方法,它基于事件驱动模型,不将整个XML文档加载到内存中,而是逐个处理XML元素。这种方式非常适合处理大文件,因为它节省了内存,但需要编写更多的代码来处理...
下面将详细阐述SAX解析XML文档及其在解决南工自习室查找问题中的应用。 首先,SAX解析的基本原理是,解析器读取XML文档时,遇到文档的各个结构元素(如元素开始、元素结束、文本内容等),会触发相应的事件回调。...
2. **解析XML**:使用`DocumentBuilderFactory`和`DocumentBuilder`创建XML文档对象。 ```java File file = new File("path_to_your_xml_file.xml"); DocumentBuilderFactory factory = DocumentBuilderFactory.new...
### Java解析XML文档方式 #### 引言 随着互联网的发展,XML(可扩展标记语言)因其平台、语言和系统的无关性,在数据交换和集成中扮演着至关重要的角色。本文将深入探讨Java中解析XML的四种主要方法:DOM、SAX、...
例如,`XMLOperatorAssis.java`可能是一个实现DOM解析的类,包含方法如`parseDOM()`,用于解析XML文档并返回一个DOM树。这种方法的优势在于能够方便地访问任意位置的节点,但缺点是占用大量内存,不适用于大型XML...