• 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());
            }
    }
    }
  • 相关阅读:
    NOIP前咕咕 : BZOJ3172: [Tjoi2013]单词
    BZOJ4350: 括号序列再战猪猪侠【区间DP】
    Codeforces 983B. XOR-pyramid【区间DP】
    POJ1651 Multiplication Puzzle【区间DP】
    LOJ10131. 「一本通 4.4 例 2」暗的连锁【树上差分】
    UOJ22. 【UR #1】外星人【DP】【思维】
    BZOJ5125: [Lydsy1712月赛]小Q的书架【决策单调性优化DP】【BIT】【莫队】【分治】
    Codeforces 868F. Yet Another Minimization Problem【决策单调性优化DP】【分治】【莫队】
    BZOJ1835: [ZJOI2010]base 基站选址【线段树优化DP】
    Codeforces 165 E. Compatible Numbers【子集前缀和】
  • 原文地址:https://www.cnblogs.com/TikyZheng/p/2690234.html
Copyright © 2020-2023  润新知