XML的四种解析方式之DOM

来源:互联网 发布:开淘宝店怎么寻找货源 编辑:程序博客网 时间:2024/05/17 20:22

1.DOM

XML解析的主要作用:可以使用DOM读取或者输出XML文件。

所有的XML文件都是由节点保存内容的,所谓的解析操作指的就是从指定的节点之中将内容读取进来。

 

在XML文件中由于更多的是描述信息的内容,所以在得到一个XML文档之后应该利用程序按照里面元素的定义名称取出对应的内容,这样的操作就称为XML解析,在XML解析中W3C定义了SAX和DOM两种解析方式。


 

JavaScript中的解析操作主要以DOM为主。

 

DOM(Document Object Model,文档对象模型),在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。


Dom_01.xml的内容如下:

<?xml version="1.0" encoding="GBK" standalone="no"?>

<addresslist>

  <linkman>

      <name>李兴华</name>

      <email>mldnqa@163.com</email>

  </linkman>

  <linkman>

      <name>MLDN</name>

      <email>mldnkf@163.com</email>

  </linkman>

</addresslist>

该文件对应的DOM树如下:



 

每个文字区域也称为一个节点称为文字节点。

 

DOM解析过程


 

Dom02.xml的内容如下:

<?xml version="1.0" encoding="GBK" standalone="no"?>

<addresslist>

   <name>李兴华</name>

</addresslist>

通过程序对该文件进行解析。【需要java帮助文档】。DOMDemo.java的内容如下:

package org.skewrain.xml.dom;

import java.io.*;

import org.w3c.dom.*;

import javax.xml.parsers.*;

public class DOMDemo {

public static void main(String args[]) throws Exception {

//取得DocumentBuilderFactory类的对象

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        //取得DocumentBuilder类的对象

        DocumentBuilder build = factory.newDocumentBuilder();

        Document doc = build.parse(new File("D:"+File.separator + "dom_02.xml"));

        NodeList nl = doc.getElementsByTagName("name");

        //输出节点

        System.out.println("姓名:"+nl.item(0).getFirstChild().getNodeValue());

    }

}

在cmd中以此运行:

Javac -d . DOMDemo.java

Java org.skewrain.xml.dom.DOMDemo

运行结果为:


 

Dom_03.xml的内容如下:

<?xml version="1.0" encoding="GBK" standalone="no"?>

<addresslist>

  <linkman>

      <name>斜雨</name>

      <email>skewrain@foxmail.com</email>

  </linkman>

  <linkman>

      <name>skewrain</name>

      <email>skewrain@foxmail.com</email>

  </linkman>

</addresslist>

通过程序对该文件进行解析。


DOMDemo2.java的内容如下:

package org.skewrain.xml.dom;

import java.io.*;

import org.w3c.dom.*;

import javax.xml.parsers.*;

public class DOMDemo2 {

public static void main(String args[]) throws Exception {

        //取得DocumentBuilderFactory类的对象

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        //取得DocumentBuilder类的对象

        DocumentBuilder build = factory.newDocumentBuilder();

        Document doc = build.parse(new File("D:"+File.separator + "dom_03.xml"));

        //得到所有的linkman节点

        NodeList nl = doc.getElementsByTagName("linkman");

        for(int x=0;x<nl.getLength();x++){

            Element e = (Element)nl.item(x); //取出每一个元素

            System.out.println("姓    名:" + e.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());

            System.out.println("邮  箱:" + e.getElementsByTagName("email").item(0).getFirstChild().getNodeValue());

        }

    }

}


在cmd中分别执行:cd d:

Javac -d . DOMDemo2.java

Java org.skewrain.xml.dom.DOMDemo2

执行结果如下:

 

DOM操作除了可以进行解析之外,也可以进行文件的生成。

如果要想生成XML文件,则在创建文档的时候,就应该使用的是newDocument();。

现在我们想生成一个XML格式的文档。

<?xml version=”1.0” encoding=”GBK”?>

<addresslist>

<linkman>

     <name>斜雨-北风</.name>

     <email>skewrain@foxmail.com</email>

</linkman>

</addresslist>

 

在DOMDemo3.java代码中的内容为:

package org.skewrain.xml.dom;

import java.io.*;

import org.w3c.dom.*;

import javax.xml.parsers.*;

public class DOMDemo3 {

public static void main(String args[]) throws Exception {

        //取得DocumentBuilderFactory类的对象

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        //取得DocumentBuilder类的对象

        DocumentBuilder build = factory.newDocumentBuilder();

        Document doc = build.newDocument();//创建一个新的XML文档。

        Element addresslist = doc.createElement("addresslist");

        Element linkman = doc.createElement("linkman");

        Element name = doc.createElement("name");

        Element email = doc.createElement("email");

        //设置节点内容

        name.appendChild(doc.createTextNode("斜雨-北风"));

        email.appendChild(doc.createTextNode("skewrain@foxmail.com"));

        //设置各个节点的关系

        linkman.appendChild(name);//name是linkman的子节点

        linkman.appendChild(email);

        addresslist.appendChild(linkman);

        doc.appendChild(addresslist);

        //得到所有的linkman节点

        NodeList nl = doc.getElementsByTagName("linkman");

        for(int x=0;x<nl.getLength();x++){

            Element e = (Element)nl.item(x); //取出每一个元素

            System.out.println("姓  名:" + e.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());

            System.out.println("邮  箱:" + e.getElementsByTagName("email").item(0).getFirstChild().getNodeValue());

        }

    }

}

运行的结果为:

 

DOM的难点在于将文档的内容输出保存到文件中。下面的代码的作用是将文档的内容输出到新生成的文件中。

package org.skewrain.xml.dom;

import java.io.*;

import org.w3c.dom.*;

import javax.xml.parsers.*;

import javax.xml.transform.*;

import javax.xml.transform.dom.*;

import javax.xml.transform.stream.*;

public class DOMDemo3 {

public static void main(String args[]) throws Exception {

        //取得DocumentBuilderFactory类的对象

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        //取得DocumentBuilder类的对象

        DocumentBuilder build = factory.newDocumentBuilder();

        Document doc = build.newDocument();//创建一个新的XML文档。

        Element addresslist = doc.createElement("addresslist");

        Element linkman = doc.createElement("linkman");

        Element name = doc.createElement("name");

        Element email = doc.createElement("email");

        //设置节点内容

        name.appendChild(doc.createTextNode("斜雨-北风"));

        email.appendChild(doc.createTextNode("skewrain@foxmail.com"));

        //设置各个节点的关系

        linkman.appendChild(name);//name是linkman的子节点

        linkman.appendChild(email);

        addresslist.appendChild(linkman);

        doc.appendChild(addresslist);

        TransformerFactory tf = TransformerFactory.newInstance();

        Transformer t = tf.newTransformer();

        t.setOutputProperty(OutputKeys.ENCODING,"GBK");//处理中文

        DOMSource source = new DOMSource(doc);//准备输出文档

        StreamResult result = new StreamResult(new File("d:"+File.separator+"output.xml"));

        t.transform(source,result);

        //得到所有的linkman节点

        NodeList nl = doc.getElementsByTagName("linkman");

        for(int x=0;x<nl.getLength();x++){

            Element e = (Element)nl.item(x); //取出每一个元素

        System.out.println("姓  名:" + e.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());

        System.out.println("邮  箱:" + e.getElementsByTagName("email").item(0).getFirstChild().getNodeValue());

        }

    }

}

在编译运行之后,可以发现新生成了一个output.xml的文件,文件的内容如下:

<?xml version="1.0" encoding="GBK" standalone="no"?><addresslist><linkman><name>斜雨-北风</name><email>skewrain@foxmail.com</email></linkman></addresslist>

通过以上的例子,我们可以看出,DOM可以实现文件的读取及修改操作,但使用的更多的是读取操作。

0 0