xml DOM中的節點類型html
首先介紹一些XML的節點類型,你能夠沒必要所有細看,能夠重點了解Element節點和Text節點。以下圖1所示,爲XML文檔的12中節點類型。java
圖1:XML文檔節點類型node
在DOM中除了上面的12種節點類型外,還有一個抽象公共基類就是Node,表明節點的抽象。Node能夠表明圖1中的任何一種節點類型。Node類抽象了一些基本的操做,例如得到節點的類型、節點的名稱、節點的值等。windows
對於一個節點(Node)最重要的3個屬性就是nodeName(節點名稱),nodeValue(節點值),nodeType(節點類型)。而咱們最經常使用的3個節點就是Element節點,Text節點和Attr節點,對於Attr節點通常不多單獨使用,都是用Element節點直接獲取屬性值。Element是能夠嵌套的,因此通常都是以Element爲中心來處理xml文件。dom
Element:ui
<property name="content">hello world</property>表明一個Element節點,它包含一個Text類型的子節點。spa
Attr:.net
Element節點<property environment="env"/>中的environment="env"就是一個Attr節點code
Text:xml
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:
其中nodeType爲1表示是Element節點,nodeType爲3表示是Text節點,具體的對於關係參見圖4。nodeName和nodeValue的值對應關係參見圖3。
爲了更加清晰的弄清楚輸出的含義,請看下圖2:
圖2:XML文檔的節點示意圖
testNode首先是從整個文檔中得到一個Element節點,這個是一個nodeNamea爲project的節點也是根節點。而後輸出的是該根節點的全部子節點。如上圖2所示一共9個子節點,全部子節點的長度爲9。
從上圖2也能夠意會一些出節點的劃分方式,值得注意和強調的是Element節點是可嵌套的,<property name="content">hello world</property>這個Element節點就是一個嵌套節點,若是要獲得hello world不能直接經過Element的節點的getNodeValue來取的,由於Element節點的getNodeValue返回值是空。取而代之的是經過Element得到它的Text子節點,在經過Text節點的getNodeValue來得到其值。
圖3:XML節點的nodeName與nodeValue
圖4:XML 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/