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可以实现文件的读取及修改操作,但使用的更多的是读取操作。