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
执行结果如下:
如果要想生成XML文件,则在创建文档的时候,就应该使用的是newDocument();。
现在我们想生成一个XML格式的文档。
<?xmlversion=”1.0”encoding=”GBK”?>
<addresslist>
<linkman>
<name>斜雨-北风</.name>
<email>skewrain@foxmail.com</email>
</linkman>
</addresslist>
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>