`

(二) 解析XML文档(parse xml)

 
阅读更多

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);
    }

 

 

分享到:
评论

相关推荐

    纯C语言XML解析xmlparse.c&xmlparse;.h

    xmlparse.c文件包含了解析XML文档的主要实现代码。它通常会通过读取XML文档的字节流,逐步构建XML元素树。解析过程包括词法分析(Tokenization)、语法分析(Parsing)和语义分析(Semantic Analysis)。词法分析将...

    QT解析xml文档 读取写入

    在QT中解析XML文档主要依赖于QDomDocument类和相关的辅助类,如QDomElement、QDomNode等。XML(eXtensible Markup Language)是一种结构化数据格式,常用于存储和传输数据。 XML文档由一系列元素组成,每个元素都有...

    C++解析xml文档或者xml字符串方法

    在C++中,解析XML文档或XML字符串是常见的任务,特别是在需要与JavaScript或其他不支持指针的语言交互时。本文将详细介绍如何在Visual Studio 2010环境下利用Microsoft的MSXML库来处理XML数据。 首先,让我们看看...

    Servlet利用SAX解析XML文档

    本主题将深入探讨如何在Servlet中利用SAX解析XML文档。 首先,我们需要了解SAX解析的基本原理。SAX解析器不创建整个XML文档树,而是当遇到XML文档的各个部分(如元素、属性、文本等)时,触发相应的事件回调函数。...

    xml-vc解析xml文档

    本篇将详细讲解如何在VC++中使用MSXML库解析XML文档,以"CHINAmap2008"为例。 首先,我们需要理解MSXML,它是Microsoft XML Core Services的缩写,提供了C++和COM接口来处理XML文档。MSXML包括几个主要组件,如DOM...

    Java SAX解析Xml文档Demo

    本示例将详细解释如何在Java中使用SAX解析XML文档,并通过注释进行详细说明。 首先,我们需要引入SAX解析器的依赖库,通常这可以通过在项目构建配置中添加JAXB或Xerces实现来实现。 ```java // 引入必要的库,如...

    java dom 解析 xml 实例

    二、使用 DOM 解析 XML 文档 使用 DOM 解析 XML 文档需要以下步骤: 1. 创建 DocumentBuilderFactory 对象,用于创建 DocumentBuilder 对象。 2. 使用 DocumentBuilder 对象解析 XML 文档,获取 Document 对象。 3...

    Sax解析XML文件解析

    3. **解析XML**:调用`parse`方法,传入XML文件的输入流或URL,开始解析过程。 **SAX解析XML的关键事件处理:** 1. **startDocument()**:开始解析文档时触发。 2. **startElement()**:遇到开始标签时触发,提供...

    Java使用sax、dom、dom4j解析xml文档

    Java提供了多种解析XML的API,包括SAX(Simple API for XML)、DOM(Document Object Model)以及DOM4J。下面我们将详细探讨这些解析方式及其在实际开发中的应用。 1. SAX解析器: SAX是一种基于事件驱动的解析器,...

    解析XML文档

    在Java编程中,解析XML文档是一项常见的任务,用于读取和操作XML文件中的数据。XML(eXtensible Markup Language)是一种标记语言,常用于存储和传输数据,尤其是在Web服务和配置文件中。本篇文章将深入探讨四种主流...

    STM32解析XML

    5. **解析XML文档**:使用`xml_parse()`函数开始解析XML数据。这个过程会逐行处理XML文档,返回XML元素的节点结构。 6. **处理XML节点**:在解析过程中,通过回调函数处理每个元素节点,提取元素名、属性和文本内容...

    XMLParse

    XMLParse 是一个基于VC++(Visual C++)的XML解析类,用于处理和解析XML文档。XML(eXtensible Markup Language)是一种标记语言,常用于数据交换、配置存储等,因为它具有良好的结构化和可读性。XMLParse类可能包含...

    XML_parse代码解析1

    `ParseXML`类的实例`p1`用于解析XML文件,其`parse()`方法接收XML文件路径作为参数。在解析完成后,`Processor`对象`proc`被创建,并调用`displayEnergy()`显示特定级别的能量信息。最后,`ParseXML`对象被删除,...

    使用Apache的Digester来解析XML文档

    5. **解析XML**:最后,使用配置好的 Digester 对象解析XML文件: ```java Root root = null; try (InputStream is = new FileInputStream("path_to_xml_file.xml")) { root = digester.parse(is); } catch ...

    javaSAX方式解析xml文档

    Java SAX方式解析XML文档是一种高效的处理大型XML文件的方法,它基于事件驱动模型,不将整个XML文档加载到内存中,而是逐个处理XML元素。这种方式非常适合处理大文件,因为它节省了内存,但需要编写更多的代码来处理...

    SAX解析XML文档

    下面将详细阐述SAX解析XML文档及其在解决南工自习室查找问题中的应用。 首先,SAX解析的基本原理是,解析器读取XML文档时,遇到文档的各个结构元素(如元素开始、元素结束、文本内容等),会触发相应的事件回调。...

    利用 dom4j 解析 xml 文档

    2. **解析XML**:使用`DocumentBuilderFactory`和`DocumentBuilder`创建XML文档对象。 ```java File file = new File("path_to_your_xml_file.xml"); DocumentBuilderFactory factory = DocumentBuilderFactory.new...

    java解析xml文档方式

    ### Java解析XML文档方式 #### 引言 随着互联网的发展,XML(可扩展标记语言)因其平台、语言和系统的无关性,在数据交换和集成中扮演着至关重要的角色。本文将深入探讨Java中解析XML的四种主要方法:DOM、SAX、...

    xml 解析 xml 解析几何

    例如,`XMLOperatorAssis.java`可能是一个实现DOM解析的类,包含方法如`parseDOM()`,用于解析XML文档并返回一个DOM树。这种方法的优势在于能够方便地访问任意位置的节点,但缺点是占用大量内存,不适用于大型XML...

Global site tag (gtag.js) - Google Analytics