快速理解使用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/

相关文章
相关标签/搜索