DOM 解析操作知识

DOM 相关知识整理

1. DOM, 全名为 Document Object Model, 文档对象模型。基于 DOM 的 XML 分析器将一个 XML 文档转换成一个对象模型的集合,通常称为 DOM 树,应用程序正是通过对这个对象模型的操作,来实现对 XML 文档数据的操作。也成为随机访问机制。

2. DOM 分析器把整个 XML 文档转化成 DOM 树放在内存里,当文档较大或者结构较复杂时,对内存的需求比较高。

3. DOM 的四个核心操作接口:

Document: 此接口代表了整个 XML 文档,表示整个 DOM 树的根,提供了对文档中的数据进行访问和操作的入口。通过 Document 节点可以访问 XML 文件中所有的元素数据。

 常用方法:

public NodeList getElementsByTagName (string tagname) // 取得指定节点名称的 NodeList

public Element createElement(String tagName) throws DOMException // 创建一个指定名称的节点

public Text createTextNode(String data) // 创建一个文本内容节点

Element createElement(String tagName) throws DOMException  //创建一个节点元素

public Attr createAttribute(String name) throws DOMException  //创建一个属性

Node: 此接口在整个 DOM 树中具有举足轻重的低位,DOM 操作的和新接口中有很大一部分接口是从 Node 接口中继承过来的。

常用方法:

Node appendChile(Node newChile) throws DOMException  // 在当前节点下增加一个新节点

public NodeList getChileNodes()  //取得本节点下的全部子节点

public Node getFirstChile()  //取得本节点下第一个子节点

public Node getLastChile()  //取得本几点下最后一个子节点

public boolean hasChileNodes()  //判断是否还有其他节点

public boolean hasAttributes()  //判断是否还有其他属性

String getNodeValue() throws DOMException  //取得节点内容

NodeList: 此接口表示一个节点的集合,一般用于表示有顺序关系的一组节点。

常用方法:

public int getLength()  //取得节点的个数

public Node item(int index)  //根据索引取得节点对象

NamedNodeMap:此接口表示一组节点和其唯一名称对应的一一对应关系,主要用于属性节点的表示。

进行 DOM 解析操作的基本操作流程:

1. 建立 DocumentBuilderFactory: DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

2. 建立 DocumentBuilder: DocumentBuilder builder = factory.newDocumentBuilder();

3. 建立 Document: Document doc = builder.parse("要读取的文件路径");

4. 建立 NodeList: NodeList nl = doc.getElementsByTagName("读取节点");

5. 进行 XML 信息读取。

下面的代码是一个简单的读取节点的例子,sample 文件如下

<?xml version="1.0" encoding="GBK"?>

<addresslist>

  <name>Tiky</name>

</addresslist>

import java.io.File;
import java.io.IOException;

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

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;


public class DOMDemo01 {

    /**
     * @param args
     * @throws ParserConfigurationException 
     */
    public static void main(String[] args){
        // TODO Auto-generated method stub
        //建立 DocumentBuilderFactory, 以取得 DocumentBuilder
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        //通过 DocumentBuilderFactory,取得 DocumentBuilder
        DocumentBuilder builder = null;
        try {
            builder = factory.newDocumentBuilder();
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        Document doc = null;
        
        try {
            doc=builder.parse("D:\\test"+File.separator+"test.xml");
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        NodeList nl= doc.getElementsByTagName("name");
        
        System.out.println("姓名:"+ nl.item(0).getFirstChild().getNodeValue());
}
}

 注释:

1. 在 DOM 解析中,每一个节点的内容实际上都是一个单独的文本节点,所以以下语句表示的是

nl.item[0].getFirstChile().getNodeValue()

取得 name 节点下的第一个子节点的第一个文本节点,并通过 getNodeValue()取得了节点的内容。

 下面的例子是一个带循环的输出节点的例子,sample 文件如下

<?xml version="1.0" encoding="UTF-8"?>
<menutree>
<item>
<main>
<text>软件要求</text>
<url>movies/软件要求.swf</url>
<fps>30</fps>
<width>800</width>
<height>600</height>
</main>
</item>
<item>
<main>
<text>本地化思想</text>
<url>movies/本地化思想.swf</url>
<fps>30</fps>
<width>800</width>
<height>600</height>
</main>
</item>
<item>
<main>

</menutree>

代码:

import java.io.File;
import java.io.IOException;

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

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;


public class DOMDemo01 {

    /**
     * @param args
     * @throws ParserConfigurationException 
     */
    public static void main(String[] args){
        // TODO Auto-generated method stub
        //建立 DocumentBuilderFactory, 以取得 DocumentBuilder
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        //通过 DocumentBuilderFactory,取得 DocumentBuilder
        DocumentBuilder builder = null;
        try {
            builder = factory.newDocumentBuilder();
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        Document doc = null;
        
        try {
            doc=builder.parse("D:\\test"+File.separator+"test.xml");
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        NodeList nl= doc.getElementsByTagName("item");
        
        for (int i=0; i<nl.getLength();i++)
        {
            
            Element e =(Element)nl.item(i);
          
            System.out.println(i +". " + e.getElementsByTagName("text").item(0).getFirstChild().getNodeValue());

            System.out.println("宽度: "+ e.getElementsByTagName("width").item(0).getFirstChild().getNodeValue());
        }
}
}
原文地址:https://www.cnblogs.com/TikyZheng/p/2690234.html