`
forlab
  • 浏览: 133971 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用dom解析xml文档

 
阅读更多

声明:本文是观看传智播客方立勋视频的学习过程,非常详细,做一点总结。

一:在解析xml文档对象以前,需要获得文档对象。这部分是模版代码

    //1:创建工厂,使应用程序能够从 XML 文档获取生成 DOM 对象树的解析器  
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();        
    //2:得到dom解析器  
    DocumentBuilder builder = factory.newDocumentBuilder();  
    //3:解析xml文档,得到代表文档的document  
    Document doc = builder.parse("src/Book.xml");  

 其中很多对文档操作后,需要更新文档的部分也是模版代码。

    //把跟新后的内存写会到文档  
            TransformerFactory tffactory = TransformerFactory.newInstance();  
            Transformer tf = tffactory.newTransformer();  
            tf.transform(new DOMSource(doc),new StreamResult(new FileOutputStream("src/Book.xml")));  

 当然这些代码应该放在一个工具类,但是也懒得做了,下面的代码显得臃肿了一些。

二:获得了文档对象以后,就是对文档的CRUD过程。
先说一句十分重要的话:XML文档中的类容会有对应的对象 :标签ELEMENT对象,文本变为Text对象,还有属性Attri对象。但不管是什么对象,都是Node的子类,所以在开发中可以把获取到的任意节点都当做Node看待。合适的转换很重要。

文档添加:

a:添加节点

    //添加节点  
    @Test  
    public void add() throws Exception{  
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
        DocumentBuilder builder = factory.newDocumentBuilder();  
        Document doc = builder.parse("src/Book.xml");  
          
        //创建节点  
        Element price = doc.createElement("售价");  
        price.setTextContent("59.00");  
          
        //把创建的节点挂到第一本书上  
          
        Element book = (Element) doc.getElementsByTagName("书").item(0);  
        book.appendChild(price);  
          
        //把跟新后的内存写回到文档  
        TransformerFactory tffactory = TransformerFactory.newInstance();  
        Transformer tf = tffactory.newTransformer();  
        tf.transform(new DOMSource(doc),new StreamResult(new FileOutputStream("src/Book.xml")));  
          
    }  
 

这里面注意的是添加节点以后,要将更新后的内存写回到文档

b:将节点添加到指定的位置上

    //向文档中指定位置添加节点  
        @Test  
        public void add2() throws Exception{  
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
            DocumentBuilder builder = factory.newDocumentBuilder();  
            Document doc = builder.parse("src/Book.xml");  
              
            //创建节点  
            Element price = doc.createElement("售价");  
            price.setTextContent("59.00");  
            //得到参考节点  
            Element refnode = (Element) doc.getElementsByTagName("售价").item(0);  
              
            //得到要挂仔的节点  
            Element book = (Element) doc.getElementsByTagName("书").item(0);  
            //插入  
            book.insertBefore(price, refnode);  
              
            //把跟新后的内存写会到文档  
            TransformerFactory tffactory = TransformerFactory.newInstance();  
            Transformer tf = tffactory.newTransformer();  
            tf.transform(new DOMSource(doc),new StreamResult(new FileOutputStream("src/Book.xml")));  
              
        }  
 

c:添加属性

[java] view plaincopy

    //向文档中添加属性  
    @Test  
    public void addAttribute() throws Exception{  
          
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
        DocumentBuilder builder = factory.newDocumentBuilder();  
        Document doc = builder.parse("src/Book.xml");  
          
        Element element = (Element) doc.getElementsByTagName("书名").item(0);  
        element.setAttribute("name", "xxxx");  
          
        //把跟新后的内存写会到文档  
        TransformerFactory tffactory = TransformerFactory.newInstance();  
        Transformer tf = tffactory.newTransformer();  
        tf.transform(new DOMSource(doc),new StreamResult(new FileOutputStream("src/Book.xml")));          
    }  
 

读取文档:

a:得到指定标签的内容

    @Test  
    public void Read1() throws Exception{  
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
        DocumentBuilder builder = factory.newDocumentBuilder();  
        Document doc = builder.parse("src/Book.xml");  
          
        NodeList  list = doc.getElementsByTagName("书名");  
        Node node = list.item(1);//从0开始  
        String content = node.getTextContent();  
        System.out.println(content);  
    }  

 b:遍历所有的标签,这里面使用的递归。

    @Test  
        public void Read2() throws Exception{  
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
            DocumentBuilder builder = factory.newDocumentBuilder();  
            Document doc = builder.parse("src/Book.xml");  
              
            //得到根节点  
            Node root = doc.getElementsByTagName("书架").item(0);  
            list(root);//递归打印  
        }  
          
        private void list(Node node) {  
            if(node instanceof Element){  
                System.out.println(node.getNodeName());  
            }  
            NodeList list = node.getChildNodes();  
            for(int i=0;i<list.getLength();i++){  
                Node child = list.item(i);  
                list(child);  
            }  
        }  

 c:得到指定标签的属性,这里面使用了Node--->Eelement的转换

    @Test  
    public void Read3() throws Exception{  
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
        DocumentBuilder builder = factory.newDocumentBuilder();  
        Document doc = builder.parse("src/Book.xml");  
          
        Element node = (Element) doc.getElementsByTagName("书名").item(0);  
        String value = node.getAttribute("name");  
        System.out.println(value);  
    }  

 3:删除:

@Test  
    public void delete() throws  Exception{  
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
        DocumentBuilder builder = factory.newDocumentBuilder();  
        Document doc = builder.parse("src/Book.xml");  
        //得到要删除的节点  
        Element e = (Element) doc.getElementsByTagName("售价").item(0);  
        //得到要删除节点的父节点  
        Element book = (Element) e.getParentNode();  
        //删除  
        book.removeChild(e);//或者e.getParentNode().removeChild(e);     
          
        //把跟新后的内存写会到文档  
        TransformerFactory tffactory = TransformerFactory.newInstance();  
        Transformer tf = tffactory.newTransformer();  
        tf.transform(new DOMSource(doc),new StreamResult(new FileOutputStream("src/Book.xml")));  
    } 

 4:更改

    @Test  
    public void update() throws  Exception{  
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
        DocumentBuilder builder = factory.newDocumentBuilder();  
        Document doc = builder.parse("src/Book.xml");  
        //得到要更新的节点  
        Element e = (Element) doc.getElementsByTagName("售价").item(0);  
          
        //把跟新后的内存写会到文档  
        TransformerFactory tffactory = TransformerFactory.newInstance();  
        Transformer tf = tffactory.newTransformer();  
        tf.transform(new DOMSource(doc),new StreamResult(new FileOutputStream("src/Book.xml")));  
              
    }  

 三:总结

通过上面的代码演示,可以感到到模版代码比较多。就是固定的获得文档,写回文档。

然后重要的亮点重复一下:

1:XML文档中的类容会有对应的对象:标签ELEMENT对象,文本变为Text对象,还有属性Attri对象。但不管是什么对象,都是Node的子类,所以在开发中可以把获取到的任意节点都当做Node看待。

2:递归遍历所有的标签。

 

实例

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.junit.BeforeClass;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 * @author forlab
 * @version 2012-12-19
 */
public class Dom {

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
	}
	
	@Test
	public void readXml() throws ParserConfigurationException, SAXException, IOException{
		DocumentBuilderFactory db = DocumentBuilderFactory.newInstance();
		DocumentBuilder dbuilder = db.newDocumentBuilder();
		Document dom = dbuilder.parse("src/dom.xml");
		Node node = dom.getElementsByTagName("书架").item(0);
		list(node);
	}

	private void list(Node node) {
		if(node instanceof Element){
			System.out.println(node.getNodeName());
		}
		NodeList nodes = node.getChildNodes();
		for(int i=0;i<nodes.getLength();i++){
			Node child = nodes.item(i);
			list(child);
		}
	}
	
	@Test
	public void readXmlByAttrubuteName() throws ParserConfigurationException, SAXException, IOException{
		DocumentBuilderFactory db = DocumentBuilderFactory.newInstance();
		DocumentBuilder dbuilder = db.newDocumentBuilder();
		Document dom = dbuilder.parse("src/dom.xml");
		Element element = (Element) dom.getElementsByTagName("作者").item(0);
		System.out.println(element.getAttribute("name"));
	}
}
 

 

分享到:
评论

相关推荐

    使用DOM解析XML文档

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

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

    使用DOM解析XML的基本步骤如下: 1. **导入必要的库**:在Java中,DOM解析功能主要由`javax.xml.parsers`和`org.w3c.dom`包提供。因此,首先需要在代码中导入这些库: ```java import javax.xml.parsers....

    java dom 解析 xml 实例

    Java DOM 解析 XML 实例是 Java 语言中常用的 XML 解析方法之一,使用 W3C 推荐的文档对象模型(Document Object Model,DOM)来解析 XML 文档。DOM 提供了一个树形结构的对象模型,通过遍历树形结构可以访问和操作 ...

    DOM解析XML文件例子

    在这个例子中,我们将深入探讨如何使用DOM解析XML文件,以理解和掌握XML文档的结构,并进行数据提取、修改和创建。 首先,XML(Extensible Markup Language)是一种标记语言,用于存储和传输数据,具有自描述性和...

    用dom解析xml文件

    使用DOM解析XML文件的步骤如下: 1. 加载XML文件:首先,你需要创建一个`DocumentBuilderFactory`对象,然后通过`newDocumentBuilder()`方法得到一个`DocumentBuilder`实例。接着,调用`parse()`方法,传入XML文件...

    DOM解析xml文件实例讲解

    本篇文章将深入探讨DOM解析XML文件在Android中的应用实例。 首先,DOM解析的基本思想是将整个XML文件加载到内存中,形成一个树形结构,即DOM树。这样做的优点是解析后的数据可以方便地进行任意位置的查找和修改,但...

    XML应用开发(软件品牌)-1期 第6单元 单元测试卷答案-使用DOM解析XML文档.doc

    在单元六的学习中,主要关注了使用DOM解析XML文档的相关知识点: 1. **DOM解析**:DOM解析器将XML文档转化为内存中的对象模型,这个模型可以被JavaScript或其他编程语言访问。DOM解析器的主要任务是将XML文档结构...

    Android Dom解析XML

    总结来说,Android中使用DOM解析XML是一种常见且直观的方式,适合处理小规模的数据。结合ButterKnife库,可以方便地将解析结果与UI组件进行绑定,提高代码的可读性和维护性。但请注意,对于大文件,考虑使用SAX或者...

    android上使用DOM解析XML

    总结来说,Android上使用DOM解析XML是一种常见且强大的方法,适用于处理小到中等大小的XML文件。通过理解DOM模型和相应的API,开发者可以高效地解析XML数据,为应用程序提供丰富的信息处理能力。然而,对于大型XML...

    android Dom解析xml文件

    本篇文章将深入探讨Android中的DOM解析XML文件,包括其基本原理、实现步骤和一些实用技巧。 ### 1. DOM解析的基本概念 DOM解析是一种将XML文件转换为内存中对象模型的方法。它将XML文档视为一棵树,其中每个元素、...

    经典的DOM解析XML范例

    在提供的代码示例中,展示了如何使用DOM解析XML文件`library.xml`。首先,通过`DocumentBuilderFactory`创建解析器,然后解析文件,得到`Document`对象。接着,获取根元素`books`,并通过`getChildNodes()`遍历所有...

    java_dom解析xml xml java

    标题“java_dom解析xml xml java”表明了本文档的主题是关于如何使用Java中的DOM技术来解析XML文件。 #### 描述分析 描述中提到这是一个适合新手入门的内容,并给出了一个简单的XML示例。该XML文档包含了一个`...

    DOM解析XML应用实例(入门经典案例)

    DOM解析XML时,会将整个XML文档加载到内存中,形成一棵由节点构成的树形结构,每个节点代表XML文档的一部分,如元素、属性、文本等。 首先,了解DOM解析的基本步骤: 1. 加载XML文档:使用Java的`...

    java使用dom解析xml

    Java 使用 DOM 解析 XML 是一种常见的处理 XML 文档的方式,DOM 即 Document Object Model,它是一种 W3C 标准的 API,用于处理 XML 和 HTML 文档。在 Java 中,DOM 解析允许开发者将整个 XML 文件加载到内存中,...

    使用Dom解析xml文件

    Dom 解析讲解,很清晰,易懂,对于初学者是个很好的资源

    dom4解析xml需要的包

    1. **解析XML**:DOM4J支持使用DOM、SAX或StAX解析器读取XML文件,其中DOM是将整个XML文档加载到内存中,适用于小型文件;SAX是事件驱动的解析,适用于大文件;而StAX则提供了一种更高效的方式,通过迭代器逐个处理...

    使用dom4j 和本地dom 解析xml 文件

    在压缩包文件"复件 dom"中,可能包含了示例代码或教程,用于演示如何使用DOM4J和本地DOM解析XML文件。通过查看这些文件,你可以更深入地了解两种方法的具体实现,并在实际项目中选择合适的方式处理XML数据。 总结来...

    JAVA DOM解析XML文件过程详解

    JAVA DOM 解析 XML 文件过程详解是指使用 JAVA 语言通过 DOM(Document Object Model)解析 XML 文件的过程。DOM 是一种应用程序接口(API),它将 XML 文档转换为一个树形结构,允许开发者使用 JAVA 语言来访问和...

    java中用dom解析xml的经典入门级文档

    #### 四、使用DOM解析XML文档 接下来,我们通过一个简单的例子来看一下如何使用DOM来解析XML文档。 ##### 1. 示例XML文档 ```xml &lt;?xml version="1.0" encoding="gb2312"?&gt; &lt;name&gt;rjzjh &lt;price&gt;jjjjjj ``...

Global site tag (gtag.js) - Google Analytics