一、用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"))); } }