`
tenght
  • 浏览: 51923 次
社区版块
存档分类
最新评论

DOM操作XML文档

 
阅读更多

位于org.w3c.dom操作XML会比较简单,就是将XML看做是一颗树,DOM就是对这颗树的一个数据结构的描述,但对大型XML文件效果可能会不理想

DocumentBuilderFactory如其名,java的命名往往代表了很详细的意义,所以他就是DocumentBuilder的一个工厂,可以生产DocumentBuilder对象,同理DocumentBuilder就是Doucument的builder啦,就可以根据需求去解析已有xml文件(parse)或者创建新的document文件(newDocument)。

首先来了解点Java DOM 的 API:
1.解析器工厂类:DocumentBuilderFactory

创建的方法:DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

2.解析器:DocumentBuilder

创建方法:通过解析器工厂类来获得 DocumentBuilder db = dbf.newDocumentBuilder();

3.文档树模型Document

创建方法:a.通过xml文档 Document doc = db.parse("bean.xml"); b.将需要解析的xml文档转化为输入流InputStream is = new FileInputStream("bean.xml");

Document doc = db.parse(is);

Document对象代表了一个XML文档的模型树,所有的其他Node都以一定的顺序包含在Document对象之内,排列成一个树状结构,以后对XML文档的所有操作都与解析器无关,直接在这个Document对象上进行操作即可;

下面我们来看一个简单的例子,看看在DOM中,我们是如何来操作一个XML文档的。这是一个XML文档,也是我们要操作的对象:

<?xml version="1.0" encoding="UTF-8"?>
 < messages>
< messages>Good-bye serialization, hello Java!< /messages>
< /messages>


如何利用JSP开发DOM应用? DOM是Document Object Model的缩写,即文档对象模型。XML将数据组织为一颗树,所以DOM就是对这颗树的一个对象描叙。通俗的说,就是通过解析XML文档,为XML文档在逻辑上建立一个树模型,树的节点是一个个对象。我们通过存取这些对象就能够存取XML文档的内容。

下面,我们需要把这个文档的内容解析到一个个的Java对象中去供程序使用,利用JAXP,我们只需几行代码就能做到这一点。首先,我们需要建立一个解析器工厂,以利用这个工厂来获得一个具体的解析器对象:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();   
我们在这里使用DocumentBuilderFacotry的目的是为了创建与具体解析器无关的程序,当DocumentBuilderFactory类的静态方法newInstance()被调用时,它根据一个系统变量来决定具体使用哪一个解析器。又因为所有的解析器都服从于JAXP所定义的接口,所以无论具体使用哪一个解析器,代码都是一样的。所以当在不同的解析器之间进行切换时,只需要更改系统变量的值,而不用更改任何代码。这就是工厂所带来的好处。
DocumentBuilder db = dbf.newDocumentBuilder();   
当获得一个工厂对象后,使用它的静态方法newDocumentBuilder()方法可以获得一个DocumentBuilder对象,这个对象代表了具体的DOM解析器。但具体是哪一种解析器,微软的或者IBM的,对于程序而言并不重要。
  然后,我们就可以利用这个解析器来对XML文档进行解析了:
  Document doc = db.parse("c:/xml/message.xml");
  DocumentBuilder的parse()方法接受一个XML文档名作为输入参数,返回一个Document对象,这个Document对象就代表了一个XML文档的树模型。以后所有的对XML文档的操作,都与解析器无关,直接在这个Document对象上进行操作就可以了。而具体对Document操作的方法,就是由DOM所定义的了。
  从得到的Document对象开始,我们就可以开始我们的DOM之旅了。使用Document对象的getElementsByTagName()方法,我们可以得到一个NodeList对象,一个Node对象代表了一个XML文档中的一个标签元素,而NodeList对象,观其名而知其意,所代表的是一个Node对象的列表:   NodeList nl = doc.getElementsByTagName("message");   我们通过这样一条语句所得到的是XML文档中所有<message>标签对应的Node对象的一个列表。然后,我们可以使用NodeList对象的item()方法来得到列表中的每一个Node对象:
  Node my_node = nl.item(0);
  当一个Node对象被建立之后,保存在XML文档中的数据就被提取出来并封装在这个Node中了。在这个例子中,要提取Message标签内的内容,我们通常会使用Node对象的getNodeValue()方法:
String message = my_node.getFirstChild().getNodeValue();
  请注意,这里还使用了一个getFirstChild()方法来获得message下面的第一个子Node对象。虽然在message标签下面除了文本外并没有其它子标签或者属性,但是我们坚持在这里使用getFirseChild()方法,这主要和W3C对DOM的定义有关。W3C把标签内的文本部分也定义成一个Node,所以先要得到代表文本的那个Node,我们才能够使用getNodeValue()来获取文本的内容。现在,既然我们已经能够从XML文件中提取出数据了,我们就可以把这些数据用在合适的地方,来构筑应用程序。

package com.st.demo;   
  
import java.io.File;   
import java.io.FileInputStream;   
import java.io.InputStream;   
  
import javax.xml.parsers.DocumentBuilder;   
import javax.xml.parsers.DocumentBuilderFactory;   
  
import org.w3c.dom.Document;   
import org.w3c.dom.Element;   
import org.w3c.dom.Node;   
import org.w3c.dom.NodeList;   

/*
 * Java调用XML的方法:DocumentBuilderFactory
 * */

public class Test_DocumentBuilderFactory {   
    public static void main(String[] args) {   
        Test_DocumentBuilderFactory reader = new Test_DocumentBuilderFactory();   
    }   
    public Test_DocumentBuilderFactory(){
    	
    		//step1.从 DOM 工厂获得 DOM 解析器
        DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();   
        try {   
        	//step2.得到 DOM 解析器的工厂实例
            DocumentBuilder domBuilder = domfac.newDocumentBuilder();            
            //step3.把要解析的 XML 文档转化为输入流,以便 DOM 解析器解析它
            InputStream is = new FileInputStream(new File("D:/test1.xml"));
            //step4.解析 XML 文档的输入流,得到一个 Document
            Document doc = domBuilder.parse(is);   
            //step5.得到 XML 文档的根节点
            Element root = doc.getDocumentElement();
            //setp6.得到节点的子节点
            NodeList conf = root.getChildNodes();   
            if(conf!=null){   
                for (int i = 0; i < conf.getLength(); i++) {   
                    Node config = conf.item(i);   
                     if(config.getNodeType()==Node.ELEMENT_NODE) {   
                            //step7.轮循子节点   
                            for(Node node=config.getFirstChild();node!=null;node=node.getNextSibling()) {   
                                if(node.getNodeType()==Node.ELEMENT_NODE) {   
                                    if(node.getNodeName().equals("name")) {   
                                        String name=node.getFirstChild().getNodeValue();   
                                        System.out.println("<name>  "+name);   
                                    }   
                                    if(node.getNodeName().equals("value")) {   
                                        String value=node.getFirstChild().getNodeValue();   
                                        System.out.println("<value>  "+value);   
                                    }   
                                    if(node.getNodeName().equals("description")) {   
                                        String description=node.getFirstChild().getNodeValue();   
                                        System.out.println("<description>  "+description);   
                                    } 
                                    if(node.getNodeName().equals("final")) {   
                                        String pfinal=node.getFirstChild().getNodeValue();   
                                        System.out.println("<final>  "+pfinal);   
                                    } 
                                }   
                            }   
                     }   
                }   
            }   
        } catch (Exception e) {   
            // TODO Auto-generated catch block   
            e.printStackTrace();   
        }   
           
    }   
}  


XML文件(注意跟hadoop中的configuration的格式区别):

<?xml version="1.0" encoding="GB2312" standalone="no"?>  
<configuration> 
  <property> 
     <name>io.sort.factor</name> 
     <value>10</value> 
     <description>The number of streams to merge at once while sorting files.  This determines the number of open file handles.</description> 
  </property> 
 
 <property> 
     <name>dfs.name.dir</name> 
     <value>${hadoop.tmp.dir}/dfs/name</value> 
     <description>Determines where on the local filesystem the DFS name  nodeshould store the name table(fsimage).  ……</description> 
  </property> 
 
 <property> 
     <name>dfs.web.ugi</name> 
     <value>webuser,webgroup</value> 
     <final>true</final> 
     <description>The user account used by the web interface.  Syntax: USERNAME,GROUP1,GROUP2, ……</description> 
  </property> 
</configuration> 




分享到:
评论

相关推荐

    DOM读取XML文件

    DOM解析器将整个XML文件加载到内存中,形成一个树形结构,允许开发者通过节点操作来访问和修改XML文档。这种方式的优点在于方便、直观,但缺点是占用内存较大,不适用于处理大型XML文件。 首先,我们需要了解XML的...

    【Qt】DOM读取XML文档.rar

    一旦XML文档加载成功,我们可以遍历和操作DOM树。例如,要获取根元素,可以这样做: ```cpp QDomElement root = doc.documentElement(); ``` 对于查找特定元素,`QDomDocument`提供`elementsByName`或`findFirst`...

    使用DOM读取XML文件

    DOM(Document Object Model)是处理XML文档的一种主要方式,它将XML文档解析为一个可编程的对象树,允许我们通过JavaScript、Java、Python等语言来操作和访问XML数据。本文将深入探讨如何使用DOM读取XML文件,并...

    使用DOM解析XML文档

    文档对象模型 节点和节点树 使用DOM加载XML文档 使用DOM访问、创建和修改节点

    DOM操作XML文档向表格添加数据.rar

    总结来说,通过DOM操作XML文档向表格添加数据是一项常见的Web开发任务,它涉及XML文档的读取、解析,以及HTML元素的动态创建和更新。这一过程对于构建交互式和数据驱动的Web应用程序至关重要。通过理解并熟练运用DOM...

    读取XML文件的四种方法

    缺点:DOM方法需要将整个XML文档加载到内存中,因此对于大型XML文件可能会出现性能问题。 DOM4J DOM4J是基于DOM的XML解析器,它提供了更加高效、灵活的XML解析方式。使用DOM4J方法读取XML文件,需要创建SAXReader...

    DOM解析XML文件例子

    总结来说,DOM解析XML文件是一种常见的数据处理技术,通过构建内存中的DOM树,能够方便地对XML文档进行查询、修改和操作。在JavaScript中,DOMParser是实现这一功能的关键工具。理解DOM解析的基本原理和方法,将有助...

    java dom 解析 xml 实例

    Java DOM 解析 XML 实例 Java DOM 解析 XML 实例是 Java 语言中常用的 XML 解析方法之一,...通过使用 DOM 解析 XML 文档,我们可以轻松地访问和操作 XML 文档中的元素和属性,从而实现了对 XML 文档的解析和处理。

    dom读取xml与写入xml

    这个模型由节点构成,包括元素、属性、文本等,使得程序员可以通过JavaScript、Java、Python等语言对XML文档进行读取和写入操作。本文将深入探讨DOM解析XML的原理和实践,并通过源码分析来揭示其实现细节。 首先,...

    用dom解析xml文件

    在处理XML文件时,DOM解析器会将整个XML文档加载到内存中,形成一个完整的节点树,这样我们就可以通过这个树来查找、修改或遍历XML数据。 XML(eXtensible Markup Language)是一种标记语言,常用于存储和传输结构...

    DOM解析xml文件实例讲解

    在Android开发中,DOM(Document Object Model)解析是处理XML文档的一种常见方法,它提供了一种结构化的表示XML文档的方式,并允许开发者通过编程接口与XML数据进行交互。本篇文章将深入探讨DOM解析XML文件在...

    DOM_XML.rar_DOM_dom xml_dom xml java_dom解析xml_java解析xml

    DOM解析器读取整个XML文档到内存中,构建一棵由节点组成的树,这些节点代表了XML文档的所有元素、属性、文本和其他结构。 在Java中,`org.w3c.dom`包提供了DOM解析XML的基础接口和类。以下是DOM解析XML的基本步骤:...

    Java DOM 生成XML

    Java DOM(Document Object Model)是一种基于树形结构的XML文档处理模型,它允许程序员通过对象接口来访问和操作XML文档的各个部分。DOM为XML文档提供了一种内存中的表示方式,使得开发人员可以方便地创建、修改和...

    用DOM读写XML文件

    DOM将XML文档解析为一个可操作的对象模型,使得我们能够添加、修改或删除XML元素和属性。 首先,我们需要引入DOM解析器。在Java中,我们可以使用`javax.xml.parsers.DocumentBuilderFactory`和`javax.xml.parsers....

    DOM解析XML文档

    1. 加载XML文档:首先,解析器读取XML文件并将其转化为内存中的DOM树。这个过程包括验证XML的语法正确性、处理命名空间等。 2. 构建DOM树:解析器按照XML文档的结构创建一个节点树,每个元素、属性、文本、注释等都...

    java平台中使用DOM解析xml文件

    5. **遍历和操作XML结构**:现在,你可以使用DOM API遍历XML文档的节点,获取或修改元素、属性和文本。 ```java NodeList nodeList = doc.getElementsByTagName("tag_name"); for (int i = 0; i (); i++) { ...

    android Dom解析xml文件

    DOM解析器将整个XML文档加载到内存中,形成一个树形结构,允许开发者通过节点操作来访问和修改XML内容。本篇文章将深入探讨Android中的DOM解析XML文件,包括其基本原理、实现步骤和一些实用技巧。 ### 1. DOM解析的...

    利用DOM读写XML

    总结,DOM提供了一种强大且灵活的方式来读取和操作XML文档。通过创建DOMDocument对象,我们可以构建XML文档,通过遍历和查询DOM树,我们可以读取并修改XML文档的内容。在处理复杂的数据结构和需要动态更新XML时,DOM...

    Java与XML(一):采用DOM操作XML文件.docx

    3. 易于使用:DOM提供了简单的API,使得操作XML文档变得直观和简单。 然而,DOM也有其缺点,主要是消耗资源。由于整个文档加载到内存,大型XML文件可能导致内存问题。对于大文件或资源受限的环境,SAX(Simple API ...

Global site tag (gtag.js) - Google Analytics