用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用于创建DOM模式的解析器对象 , 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"));
}
}
}