快速理解使用DOM解析簡單的XML文檔

  1. xml DOM中的節點類型html

   首先介紹一些XML的節點類型,你能夠沒必要所有細看,能夠重點了解Element節點和Text節點。以下圖1所示,爲XML文檔的12中節點類型。java

1XML文檔節點類型node

DOM中除了上面的12種節點類型外,還有一個抽象公共基類就是Node,表明節點的抽象。Node能夠表明圖1中的任何一種節點類型。Node類抽象了一些基本的操做,例如得到節點的類型、節點的名稱、節點的值等。windows

對於一個節點(Node)最重要的3個屬性就是nodeName(節點名稱),nodeValue(節點值),nodeType(節點類型)。而咱們最經常使用的3個節點就是Element節點,Text節點和Attr節點,對於Attr節點通常不多單獨使用,都是用Element節點直接獲取屬性值。Element是能夠嵌套的,因此通常都是以Element爲中心來處理xml文件。dom

Elementui

<property name="content">hello world</property>表明一個Element節點,它包含一個Text類型的子節點。spa

Attr.net

Element節點<property environment="env"/>中的environment="env"就是一個Attr節點code

Textxml

Text元素比較特殊,通常是其餘節點和節點之間的元素,例如:

<property name="content">hello world</property>

  bbb

  <!-- 這是註釋 -->

中的Text元素就是Element節點和Comment節點之間的元素(行結束符bbb行結束符)在windows中的行結束符是\r\n

Comment

<!-- 這是註釋 -->

上面介紹的是比較抽象的,下面經過一個實例來講明一下:

import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
 
import org.w3c.dom.Attr;
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;
 
public class StudyDom
{
         private static final String XML = "E:\\trayvon\\note\\client.xml";
         public static void main(String[] args)
         {
                   testNode();
         //      testElement();
         }
         private static Document init()
         {
                   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                   DocumentBuilder builder = null;
                   Document doc = null;
                   try
                   {
                            builder = factory.newDocumentBuilder();
                   } catch (ParserConfigurationException e)
                   {
                            e.printStackTrace();
                   }
                  
                   try
                   {
                            doc = builder.parse(XML);
                   } catch (SAXException | IOException e)
                   {
                            e.printStackTrace();
                   }
                   return doc;
         }
         public static void testElement()
         {
                   Document doc = init();
                   Element root = doc.getDocumentElement();
                   Attr attr = root.getAttributeNode("name");
                   System.out.println(attr);
                   System.out.println(root.getAttribute("name"));//獲取屬性名稱爲name的值
                   System.out.println(root.getTagName());
                   System.out.println(root.getNodeName());//獲取節點的名稱
                   System.out.println(root.getNodeValue());//Element節點的nodeValue爲null
                   System.out.println(root.getNodeType());//Element節點的nodeType值爲1
         }
         public static void testNode()
         {
                   Document doc = init();
                   Element root = doc.getDocumentElement();
                   NodeList childNodes = root.getChildNodes();
                   System.out.println(childNodes.getLength());
                   for(int i=0;i<childNodes.getLength();i++)
                   {
                            Node item = childNodes.item(i);
                            System.out.println("nodeType:"+item.getNodeType()+"  nodeName:"+item.getNodeName()+"  nodeValue:"+item.getNodeValue());
                   }
         }
}

 

其中client.xml的類容以下:

<?xml version="1.0"?>
<project basedir="../" name="forumclient" default="dist">
  aaa
  <property environment="env"/>
  <property name="src" value="src/client"/>
  <property name="content">hello world</property>
  bbb
  <!-- 這是註釋 -->
</project>

testNode的輸出爲:

9
nodeType:3  nodeName:#text  nodeValue:
  aaa
 
nodeType:1  nodeName:property  nodeValue:null
nodeType:3  nodeName:#text  nodeValue:
 
nodeType:1  nodeName:property  nodeValue:null
nodeType:3  nodeName:#text  nodeValue:
 
nodeType:1  nodeName:property  nodeValue:null
nodeType:3  nodeName:#text  nodeValue:
  bbb
 
nodeType:8  nodeName:#comment  nodeValue: 這是註釋 
nodeType:3  nodeName:#text  nodeValue:

其中nodeType1表示是Element節點,nodeType3表示是Text節點,具體的對於關係參見圖4nodeNamenodeValue的值對應關係參見圖3

爲了更加清晰的弄清楚輸出的含義,請看下圖2

2XML文檔的節點示意圖

testNode首先是從整個文檔中得到一個Element節點,這個是一個nodeNameaproject的節點也是根節點。而後輸出的是該根節點的全部子節點。如上圖2所示一共9個子節點,全部子節點的長度爲9

從上圖2也能夠意會一些出節點的劃分方式,值得注意和強調的是Element節點是可嵌套的,<property name="content">hello world</property>這個Element節點就是一個嵌套節點,若是要獲得hello world不能直接經過Element的節點的getNodeValue來取的,由於Element節點的getNodeValue返回值是空。取而代之的是經過Element得到它的Text子節點,在經過Text節點的getNodeValue來得到其值。

3XML節點的nodeNamenodeValue

 

4XML DOM節點類型對應的常量

總結:在使用DOM解析XML文檔是最常使用的就是Element節點,Text節點。必定要注意的就是不要使用Element節點來獲取節點的值,由於這種方式很直觀因此咱們很容易這樣作,取而代之的是用Element來取屬性值和子節點的集合,用Text節點來獲取值。

在另外一篇文章使用DOM解析簡單的XML文檔實例中咱們經過使用DOM來解析ant配置文件和pom配置文件中的jar包來講明怎樣使用Element節點和Text節點。

 

XML DOM 節點類型(Node Types):http://www.w3school.com.cn/xmldom/dom_nodetype.asp

Entity: http://www.ibm.com/developerworks/cn/xml/x-entities/

相關文章
相關標籤/搜索