XML的四种解析方式之DOM

1.DOM

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

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

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


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

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


Dom_01.xml的内容如下:

<?xmlversion="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的内容如下:

<?xmlversion="1.0"encoding="GBK"standalone="no"?>

<addresslist>

<name>李兴华</name>

</addresslist>

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

packageorg.skewrain.xml.dom;

importjava.io.*;

importorg.w3c.dom.*;

importjavax.xml.parsers.*;

publicclassDOMDemo{

publicstaticvoidmain(Stringargs[])throwsException{

//取得DocumentBuilderFactory类的对象

DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();

//取得DocumentBuilder类的对象

DocumentBuilderbuild=factory.newDocumentBuilder();

Documentdoc=build.parse(newFile("D:"+File.separator+"dom_02.xml"));

NodeListnl=doc.getElementsByTagName("name");

//输出节点

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

}

}

在cmd中以此运行:

Javac-d.DOMDemo.java

Javaorg.skewrain.xml.dom.DOMDemo

运行结果为:


Dom_03.xml的内容如下:

<?xmlversion="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的内容如下:

packageorg.skewrain.xml.dom;

importjava.io.*;

importorg.w3c.dom.*;

importjavax.xml.parsers.*;

publicclassDOMDemo2{

publicstaticvoidmain(Stringargs[])throwsException{

//取得DocumentBuilderFactory类的对象

DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();

//取得DocumentBuilder类的对象

DocumentBuilderbuild=factory.newDocumentBuilder();

Documentdoc=build.parse(newFile("D:"+File.separator+"dom_03.xml"));

//得到所有的linkman节点

NodeListnl=doc.getElementsByTagName("linkman");

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

Elemente=(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中分别执行:cdd:

Javac-d.DOMDemo2.java

Javaorg.skewrain.xml.dom.DOMDemo2

执行结果如下:

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

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

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

<?xmlversion=”1.0”encoding=”GBK”?>

<addresslist>

<linkman>

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

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

</linkman>

</addresslist>

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

packageorg.skewrain.xml.dom;

importjava.io.*;

importorg.w3c.dom.*;

importjavax.xml.parsers.*;

publicclassDOMDemo3{

publicstaticvoidmain(Stringargs[])throwsException{

//取得DocumentBuilderFactory类的对象

DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();

//取得DocumentBuilder类的对象

DocumentBuilderbuild=factory.newDocumentBuilder();

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

Elementaddresslist=doc.createElement("addresslist");

Elementlinkman=doc.createElement("linkman");

Elementname=doc.createElement("name");

Elementemail=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节点

NodeListnl=doc.getElementsByTagName("linkman");

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

Elemente=(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的难点在于将文档的内容输出保存到文件中。下面的代码的作用是将文档的内容输出到新生成文件中。

packageorg.skewrain.xml.dom;

importjava.io.*;

importorg.w3c.dom.*;

importjavax.xml.parsers.*;

importjavax.xml.transform.*;

importjavax.xml.transform.dom.*;

importjavax.xml.transform.stream.*;

publicclassDOMDemo3{

publicstaticvoidmain(Stringargs[])throwsException{

//取得DocumentBuilderFactory类的对象

DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();

//取得DocumentBuilder类的对象

DocumentBuilderbuild=factory.newDocumentBuilder();

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

Elementaddresslist=doc.createElement("addresslist");

Elementlinkman=doc.createElement("linkman");

Elementname=doc.createElement("name");

Elementemail=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);

TransformerFactorytf=TransformerFactory.newInstance();

Transformert=tf.newTransformer();

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

DOMSourcesource=newDOMSource(doc);//准备输出文档

StreamResultresult=newStreamResult(newFile("d:"+File.separator+"output.xml"));

t.transform(source,result);

//得到所有的linkman节点

NodeListnl=doc.getElementsByTagName("linkman");

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

Elemente=(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文件文件内容如下:

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

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

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念