一、用JAXP解析的步骤:
(1) 调用DocumentBuilderFactory.newInstance()方法得到创建DOM解析器的工厂;
(2) 调用工厂对象的newDocumentBuilder方法得到DOM解析器对象;
(3) 调用DOM解析器对象的parse()方法解析XML文档,得到代表整个文档的Document对象;
(4) 进行可以利用DOM特性对整个XML文档进行操作了.
二、book.xml文件
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<书架>
<书>
<书名 name=Data Structures"">数据结构(Java语言描述)</书名>
<作者>Michael Main</作者>
<售价>56</售价>
</书>
<书>
<书名>Adroid基础教程</书名>
<作者>Ed Burnette</作者>
<售价>43</售价>
</书>
</书架>
三、对XML文档进行增删改查
package cn.moving.parseXml;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.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;
public class ParseXml {
/**
* 使用dom方式对XML文档进行增删改查
*
* @throws ParserConfigurationException
* @throws IOException
* @throws SAXException
*/
@Test
// 读取<书名>Adroid基础教程</书名>
public void read() throws ParserConfigurationException, SAXException,
IOException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/cn/moving/parseXml/book.xml");
NodeList list = document.getElementsByTagName("书名");
Node node = list.item(0);
String content = node.getTextContent();
System.out.println(content);
}
@Test
// 得到文档中所有标签
public void readAll() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/cn/moving/parseXml/book.xml");
NodeList list = document.getElementsByTagName("书名");
Node root = document.getElementsByTagName("书架").item(0);
list(root);// ??????????????
}
private void 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 child = list.item(i);
list(child);
}
}
@Test
// 读取<书名 name=Data Structures"">数据结构(Java语言描述)</书名>
public void readAttribute() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/cn/moving/parseXml/book.xml");
NodeList list = document.getElementsByTagName("书名");
Element element = (Element) list.item(0);
// Element是Node的子类,所以有更多的方法
String value = element.getAttribute("name");
System.out.println(value);
/*
* //笨办法 Node node = list.item(0); if (node.hasAttributes()) {
* NamedNodeMap map = node.getAttributes(); for (int i = 0; i <
* map.getLength(); i++) { Node nd = map.item(i); String name =
* nd.getNodeName(); // nd.getNodeType() String value =
* nd.getNodeValue(); System.out.println(name + ":" + value); } }
*/
}
@Test
// 添加节点<售价>$10</售价>
public void add() throws ParserConfigurationException, SAXException,
IOException, Exception, TransformerFactoryConfigurationError {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/cn/moving/parseXml/book.xml");
Element element = document.createElement("售价");
element.setTextContent("99元");
document.getElementsByTagName("书").item(0).appendChild(element);
// 更新内存中数据,将内存中数据写入XML文件中
Transformer transformer = TransformerFactory.newInstance()
.newTransformer();
DOMSource source = new DOMSource(document);
FileOutputStream fos = new FileOutputStream(new File(
"src/cn/moving/parseXml/outbook.xml"));
StreamResult result = new StreamResult(fos);
transformer.transform(source, result);
fos.flush();
fos.close();
}
@Test
// 指定位置添加节点:给<售价>56</售价>前加<售价>100</售价>
public void addAppoint() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/cn/moving/parseXml/book.xml");
// 得到参考节点(书名)
Element refNode = (Element) document.getElementsByTagName("售价").item(0);
// 创建一个新节点
Element element = document.createElement("价格");
//element.setNodeValue("100元");//wrong
element.setTextContent("100元");
//连接节点
Element e = (Element)document.getElementsByTagName("书").item(0);
e.appendChild(element);
e.insertBefore(element, refNode);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/cn/moving/parseXml/outbook2.xml")));
}
@Test
// 删除节点<售价>10</售价>
public void delete() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/cn/moving/parseXml/outbook.xml");
Node price = document.getElementsByTagName("售价").item(0);
price.getParentNode().removeChild(price);
DOMSource source = new DOMSource(document);
// StreamResult os = new StreamResult(new File("src/cn/moving/parseXml/outbook.xml"));//true
StreamResult os = new StreamResult(new FileOutputStream("src/cn/moving/parseXml/outbook.xml"));
TransformerFactory.newInstance().newTransformer().transform(source, os);
}
@Test
// 更新售价
public void update() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/cn/moving/parseXml/book.xml");
Node bookName = document.getElementsByTagName("书").item(0).getFirstChild();
bookName.setTextContent("Android技术开发大全");
TransformerFactory.newInstance().newTransformer().transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/cn/moving/parseXml/book.xml")));
}
}