您的位置:首页 > 其它

DOM操作XML文档

2013-07-23 12:38 369 查看
位于org.w3c.dom操作XML会比较简单,就是将XML看做是一颗树,DOM就是对这颗树的一个数据结构的描述,但对大型XML文件效果可能会不理想

DocumentBuilderFactory如其名,java的命名往往代表了很详细的意义,所以他就是DocumentBuilder的一个工厂,可以生产DocumentBuilder对象,同理DocumentBuilder就是Doucument的builder啦,就可以根据需求去解析已有xml文件(parse)或者创建新的document文件(newDocument)。


首先来了解点Java DOM 的 API:

1.解析器工厂类:DocumentBuilderFactory

创建的方法:DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

2.解析器:DocumentBuilder

创建方法:通过解析器工厂类来获得 DocumentBuilder db = dbf.newDocumentBuilder();

3.文档树模型Document

创建方法:a.通过xml文档 Document doc = db.parse("bean.xml");  b.将需要解析的xml文档转化为输入流InputStream is = new FileInputStream("bean.xml");

 Document doc = db.parse(is); 

Document对象代表了一个XML文档的模型树,所有的其他Node都以一定的顺序包含在Document对象之内,排列成一个树状结构,以后对XML文档的所有操作都与解析器无关,直接在这个Document对象上进行操作即可;

下面我们来看一个简单的例子,看看在DOM中,我们是如何来操作一个XML文档的。这是一个XML文档,也是我们要操作的对象:

<?xml version="1.0" encoding="UTF-8"?>
< messages>
< messages>Good-bye serialization, hello Java!< /messages>
< /messages>


如何利用JSP开发DOM应用? DOM是Document Object Model的缩写,即文档对象模型。XML将数据组织为一颗树,所以DOM就是对这颗树的一个对象描叙。通俗的说,就是通过解析XML文档,为XML文档在逻辑上建立一个树模型,树的节点是一个个对象。我们通过存取这些对象就能够存取XML文档的内容。

下面,我们需要把这个文档的内容解析到一个个的Java对象中去供程序使用,利用JAXP,我们只需几行代码就能做到这一点。首先,我们需要建立一个解析器工厂,以利用这个工厂来获得一个具体的解析器对象:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();   

我们在这里使用DocumentBuilderFacotry的目的是为了创建与具体解析器无关的程序,当DocumentBuilderFactory类的静态方法newInstance()被调用时,它根据一个系统变量来决定具体使用哪一个解析器。又因为所有的解析器都服从于JAXP所定义的接口,所以无论具体使用哪一个解析器,代码都是一样的。所以当在不同的解析器之间进行切换时,只需要更改系统变量的值,而不用更改任何代码。这就是工厂所带来的好处。

  DocumentBuilder db = dbf.newDocumentBuilder();   

当获得一个工厂对象后,使用它的静态方法newDocumentBuilder()方法可以获得一个DocumentBuilder对象,这个对象代表了具体的DOM解析器。但具体是哪一种解析器,微软的或者IBM的,对于程序而言并不重要。

   然后,我们就可以利用这个解析器来对XML文档进行解析了:

   Document doc = db.parse("c:/xml/message.xml");

   DocumentBuilder的parse()方法接受一个XML文档名作为输入参数,返回一个Document对象,这个Document对象就代表了一个XML文档的树模型。以后所有的对XML文档的操作,都与解析器无关,直接在这个Document对象上进行操作就可以了。而具体对Document操作的方法,就是由DOM所定义的了。

   从得到的Document对象开始,我们就可以开始我们的DOM之旅了。使用Document对象的getElementsByTagName()方法,我们可以得到一个NodeList对象,一个Node对象代表了一个XML文档中的一个标签元素,而NodeList对象,观其名而知其意,所代表的是一个Node对象的列表:   NodeList nl = doc.getElementsByTagName("message");   我们通过这样一条语句所得到的是XML文档中所有<message>标签对应的Node对象的一个列表。然后,我们可以使用NodeList对象的item()方法来得到列表中的每一个Node对象:

   Node my_node = nl.item(0); 

  当一个Node对象被建立之后,保存在XML文档中的数据就被提取出来并封装在这个Node中了。在这个例子中,要提取Message标签内的内容,我们通常会使用Node对象的getNodeValue()方法: 

String message = my_node.getFirstChild().getNodeValue(); 

  请注意,这里还使用了一个getFirstChild()方法来获得message下面的第一个子Node对象。虽然在message标签下面除了文本外并没有其它子标签或者属性,但是我们坚持在这里使用getFirseChild()方法,这主要和W3C对DOM的定义有关。W3C把标签内的文本部分也定义成一个Node,所以先要得到代表文本的那个Node,我们才能够使用getNodeValue()来获取文本的内容。现在,既然我们已经能够从XML文件中提取出数据了,我们就可以把这些数据用在合适的地方,来构筑应用程序。 

package com.st.demo;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/*
* Java调用XML的方法:DocumentBuilderFactory
* */

public class Test_DocumentBuilderFactory {
public static void main(String[] args) {
Test_DocumentBuilderFactory reader = new Test_DocumentBuilderFactory();
}
public Test_DocumentBuilderFactory(){

//step1.从 DOM 工厂获得 DOM 解析器
DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();
try {
//step2.得到 DOM 解析器的工厂实例
DocumentBuilder domBuilder = domfac.newDocumentBuilder();
//step3.把要解析的 XML 文档转化为输入流,以便 DOM 解析器解析它
InputStream is = new FileInputStream(new File("D:/test1.xml"));
//step4.解析 XML 文档的输入流,得到一个 Document
Document doc = domBuilder.parse(is);
//step5.得到 XML 文档的根节点
Element root = doc.getDocumentElement();
//setp6.得到节点的子节点
NodeList conf = root.getChildNodes();
if(conf!=null){
for (int i = 0; i < conf.getLength(); i++) {
Node config = conf.item(i);
if(config.getNodeType()==Node.ELEMENT_NODE) {
//step7.轮循子节点
for(Node node=config.getFirstChild();node!=null;node=node.getNextSibling()) {
if(node.getNodeType()==Node.ELEMENT_NODE) {
if(node.getNodeName().equals("name")) {
String name=node.getFirstChild().getNodeValue();
System.out.println("<name>  "+name);
}
if(node.getNodeName().equals("value")) {
String value=node.getFirstChild().getNodeValue();
System.out.println("<value>  "+value);
}
if(node.getNodeName().equals("description")) {
String description=node.getFirstChild().getNodeValue();
System.out.println("<description>  "+description);
}
if(node.getNodeName().equals("final")) {
String pfinal=node.getFirstChild().getNodeValue();
System.out.println("<final>  "+pfinal);
}
}
}
}
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}


XML文件(注意跟hadoop中的configuration的格式区别):


<?xml version="1.0" encoding="GB2312" standalone="no"?>
<configuration>
<property>
<name>io.sort.factor</name>
<value>10</value>
<description>The number of streams to merge at once while sorting files.  This determines the number of open file handles.</description>
</property>

<property>
<name>dfs.name.dir</name>
<value>${hadoop.tmp.dir}/dfs/name</value>
<description>Determines where on the local filesystem the DFS name  nodeshould store the name table(fsimage).  ……</description>
</property>

<property>
<name>dfs.web.ugi</name>
<value>webuser,webgroup</value>
<final>true</final>
<description>The user account used by the web interface.  Syntax: USERNAME,GROUP1,GROUP2, ……</description>
</property>
</configuration>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: