XML解析之DOM解析

来源:互联网 发布:c11多线程编程 编辑:程序博客网 时间:2024/05/16 00:37
---------------------- android培训、java培训、期待与您交流! ----------------------


        DOMW3C制定的书写XML分析器的标准接口规范。DOM的全称是Document Object Model,即文档对象模型。基于DOM的解析器将一XML文档转换成一个对象模型的集合即DOM数。DOM强制使用树模型来访问XML文档中的信息,也是因为XML本质上就是一种分层结构。DOM分析器把整个XML文档转化成DOM树放在内存中,当文档较大或者结构比较复杂时,内存需求较高。DOM树采用随机访问的方式任意控制整个XML文档的内容。


DOM常见节点

元素:XML的基本构件,有其他元素、文本节点或者两者兼有来作为其子结点

属性:包含元素节点的信息,不是元素的子结点

文本:文本节点也即文本,可以包含很多信息或仅仅是空白

文档(根节点):文档节点是文档中所有其他节点的父节点。

其他不常见节点类型:CDATA、注释、处理指令



DOM的四个基本接口:DocumentNodeNodeListNamedNodeMap

Document接口:对文档进行操作的入口,从Node接口继承而来。

Node接口:其他大多数接口的父类,如DocumentElementAttributeTextComment

NodeList接口:是一个节点的集合,包含某个节点的所有子结点。

NamedNodeMap接口:也是一个节点的集合,通过他可以建立节点名和节点之间的一一映 射关系,直接利用节点名访问特定的节点。



DOM解析器解析XML文档,为XML文档在逻辑上建立一个树模型,树的节点是一个个对象,通过存取这些对象就能够存取XML文档的内容。



DOM的基本对象

Node对象:DOM结构中最基本的对象

Document对象:代表整个XML文档

NodeList对象:包含一个或多个Node的列表

Element对象:代表XML文档的标签元素


     DOM处理XML文档,首先建立一个解析器工厂(DocumentBuilderFactory),解析器工厂根据平台属性创建具体的解析器(DocumentBuilder),然后DocumentBuilderparse()方法,返回Document对象。Document对象代表了一个XML树模型。对XML的操作,就脱离了解析器,直接操作Document这个对象


示例:

import java.io.File;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;public class DomXml {public static void main(String[] args) throws Exception {//创建一个DOM解析器工厂DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();//解析器工厂根据平台属性创建具体的解析器DocumentBuilder db = dbf.newDocumentBuilder();//解析器解析具体的XML文件,返回一个代表整个XML文档的DocumentDocument doc = db.parse(new File("web.xml"));//返回一个标签名为servlet的节点集合NodeList list = doc.getElementsByTagName("servlet");//返回一个标签名为servlet-mapping的节点集合NodeList list2 = doc.getElementsByTagName("servlet-mapping");for(int i = 0 ; i < list.getLength(); i++) {Element node = (Element) list.item(i);//获得标签名为servlet-name的节点Element node1 = (Element) node.getElementsByTagName("servlet-name").item(0);//获得标签名为servlet-class的节点Element node2 = (Element) node.getElementsByTagName("servlet-class").item(0);Element node_0 = (Element)list2.item(i);//获得标签名为url-pattern的节点Element node3 = (Element)node_0.getElementsByTagName("url-pattern").item(0);//打印具体结果System.out.println("servlet-name: " + node1.getTextContent());System.out.println("servlet-class: " + node2.getTextContent());System.out.println("url-pattern: " + node3.getTextContent());System.out.println();}}}

控制台输出:

servlet-name: HelloWorldservlet-class: com.shengsiyuan.servlet.HelloWorldServleturl-pattern: /aaaservlet-name: LoginServletservlet-class: com.shengsiyuan.servlet.LoginServleturl-pattern: /LoginServlet


被解析的XML文档:

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">    <servlet>  <servlet-name>HelloWorld</servlet-name>  <servlet-class>com.shengsiyuan.servlet.HelloWorldServlet</servlet-class>  </servlet>    <servlet>  <servlet-name>LoginServlet</servlet-name>  <servlet-class>com.shengsiyuan.servlet.LoginServlet</servlet-class>  </servlet>    <servlet-mapping>  <servlet-name>HelloWorld</servlet-name>  <url-pattern>/aaa</url-pattern>  </servlet-mapping>    <servlet-mapping>  <servlet-name>LoginServlet</servlet-name>  <url-pattern>/LoginServlet</url-pattern>  </servlet-mapping>  </web-app>




---------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima
原创粉丝点击