读书人

用Jaxp包中的DOM技术对XML资料进行解析

发布时间: 2012-10-14 14:55:07 作者: rapoo

用Jaxp包中的DOM技术对XML文件进行解析并完成对文件的CRUD操作

我们学习XML文件的相关知识最主要的还是能够根据相关的XML约束写出对应的XML文件并且能够向XML文件中为一些应用程序写入配置文件。

要想完成上述操作,我们就必须首先了解对XML文件解析技术的相关知识。

具体如下:

XML解析技术概述

XML解析方式分为两种:dom和sax

? dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。

? sax: (Simple API for XML) 不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。

XML解析器

? Crimson、Xerces 、Aelfred2

XML解析开发包

? Jaxp、Jdom、dom4j

今天我们主要使用的是Jaxp XML解析开发包对XML文件进行解析。

关于JAXP

JAXP 开发包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包及其子包组成

在 javax.xml.parsers 包中,定义了几个工厂类,程序员调用这些工厂类,可以得到对xml文档进行解析的 DOM 或 SAX 的解析器对象。

使用JAXP进行DOM解析

javax.xml.parsers包中的DocumentBuilderFactory用于创—OM模式的解析器对象 , DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法 ,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。

获得JAXP中的DOM解析器

调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。

调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。

调用 DOM 解析器对象的 parse()方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。

DOM编程

DOM模型(document object model)

? DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。

? 在dom中,节点之间关系如下:

? 位于一个节点之上的节点是该节点的父节点(parent)

? 一个节点之下的节点是该节点的子节点(children)

? 同一层次,具有相同父节点的节点是兄弟节点(sibling)

? 一个节点的下一个层次的节点集合是节点后代(descendant)

? 父、祖父节点及所有位于节点上面的,都是节点的祖先(ancestor)

Node对象

Node对象提供了一系列常量来代表结点的类型,当开发人员获得某个Node类型后,就可以把Node节点转换成相应的节点对象(Node的子类对象),以便于调用其特有的方法。(查看API文档)

Node对象提供了相应的方法去获得它的父结点或子结点。编程人员通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容了。

DOM方式解析XML文件

DOM解析编程

? 遍历所有节点

? 查找某一个节点

? 删除结点

? 更新结点

? 添加节点

DOM编程练习

更新XML文档

javax.xml.transform包中的Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出,例如把xml文件应用样式表后转成一个html文档。利用这个对象,当然也可以把Document对象又重新写入到一个XML文件中。

Transformer类通过transform方法完成转换操作,该方法接收一个源和一个目的地。我们可以通过:

? javax.xml.transform.dom.DOMSource类来关联要转换的document对象,

? 用javax.xml.transform.stream.StreamResult 对象来表示数据的目的地。

Transformer对象通过TransformerFactory获得。

看一个简单示例:

Book.xml

<?xmlversion="1.0"encoding="UTF-8"standalone="no"?>

<book>

<bookname>Java程序设计</bookname>

<bookprice>40元</bookprice>

<author>lijizh</author>

<publisher>lijizh1013</publisher>

</book>

Dom.java

package dtd;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

importjavax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import org.xml.sax.SAXException;

publicclass Dom {

publicstaticvoid main(String[] args)throws ParserConfigurationException,SAXException, IOException {

//获取解析工厂

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

//创建解析器对象

DocumentBuilder db = dbf.newDocumentBuilder();

//获取Document对象

Document d = db.parse("src/dtd/Book.xml");

//通过Document对象的方法获取相应的节点列表

NodeList nl = d.getElementsByTagName("bookname");

//获取指定节点

Node node = nl.item(0);

//获取指定节点内容

String content = node.getTextContent();

//输出内容

System.out.println(content);

}

}

示例完成对XML文件的CRUD操作:

Book.xml

<?xmlversion="1.0"encoding="UTF-8"standalone="no"?>

<book>

<bookname>Java程序设计</bookname>

<bookprice>40元</bookprice>

<author>lijizh</author>

<publisher>lijizh1013</publisher>

</book>

ReadDom.java

package dtd;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

importjavax.xml.parsers.ParserConfigurationException;

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerConfigurationException;

importjavax.xml.transform.TransformerException;

importjavax.xml.transform.TransformerFactory;

import javax.xml.transform.dom.DOMSource;

importjavax.xml.transform.stream.StreamResult;

import org.junit.Test;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import org.xml.sax.SAXException;

publicclass ReadDom {

@Test

publicvoid read()throws ParserConfigurationException, SAXException, IOException{

DocumentBuilderFactoryfactory = DocumentBuilderFactory.newInstance();

DocumentBuilder db =factory.newDocumentBuilder();

Document d = db.parse("src/dtd/Book.xml");

Node node = d.getElementsByTagName("book").item(0);

// System.out.println(node.getNodeName());

list(node);

}

//用此方法遍历元素节点

privatevoid list(Node node) {

if(node instanceof Element)

{

System.out.println(node.getNodeName());

}

NodeList list = node.getChildNodes();

for(int i = 0;i< list.getLength();i++){

Node node1 =list.item(i);

list(node1);

}

}

@Test

//以尾部追加的方式向XML文件中增添数据的方法

publicvoid insert()throws ParserConfigurationException, SAXException,IOException, TransformerException{

DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();

DocumentBuilderdb = factory.newDocumentBuilder();

Document d = db.parse("src/dtd/Book.xml");

Element node = (Element)d.getElementsByTagName("book").item(0);

Element newNode =d.createElement("color");

newNode.setTextContent("red");

node.appendChild(newNode);

//通过转换工厂的newInstance()方法获取工厂实例

TransformerFactory tff =TransformerFactory.newInstance();

//获取转换器

Transformer tf =tff.newTransformer();

//通过转换器对象的transform方法将源与目标文件相连接

tf.transform(new DOMSource(d),new StreamResult("src/dtd/Book.xml"));

}

@Test

//以向前插入的方式向XML文件中增添数据的方法

publicvoid insert1()throws ParserConfigurationException, SAXException, IOException,TransformerException{

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder db = factory.newDocumentBuilder();

Document d = db.parse("src/dtd/Book.xml");

Element node = (Element)d.getElementsByTagName("book").item(0);

Element newNode = d.createElement("publisher");

newNode.setTextContent("lijizh");

Element refChild = (Element)d.getElementsByTagName("color").item(0);

node.insertBefore(newNode, refChild);

TransformerFactory tff = TransformerFactory.newInstance();

Transformer tf = tff.newTransformer();

tf.transform(new DOMSource(d),new StreamResult("src/dtd/Book.xml"));

}

@Test

//从XML文件中删除数据的方法

publicvoid delete()throws ParserConfigurationException, SAXException, IOException,TransformerException{

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder db = factory.newDocumentBuilder();

Document d = db.parse("src/dtd/Book.xml");

Element node = (Element)d.getElementsByTagName("color").item(0);

Element parent =(Element)node.getParentNode();

parent.removeChild(node);

TransformerFactory tff = TransformerFactory.newInstance();

Transformer tf = tff.newTransformer();

tf.transform(new DOMSource(d),new StreamResult("src/dtd/Book.xml"));

}

@Test

////从XML文件中更新数据的方法

publicvoid update()throws ParserConfigurationException, SAXException, IOException,TransformerException{

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder db = factory.newDocumentBuilder();

Document d = db.parse("src/dtd/Book.xml");

Element node = (Element)d.getElementsByTagName("publisher").item(0);

node.setTextContent("lijizh1013");

TransformerFactory tff = TransformerFactory.newInstance();

Transformer tf = tff.newTransformer();

tf.transform(new DOMSource(d),new StreamResult("src/dtd/Book.xml"));

}

}

}


读书人网 >XML SOAP

热点推荐