package com.franky.xml; import java.io.FileOutputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * @描述 使用JAXP技术解析XML文件 * @作者 franky * @日期 2015-1-4 下午11:04:22 * @说明 在XML文件中所有能够被解析成对象的标识,都是Node对象 * Element是从Node继承的 */ public class JAXPAnalyzeXML { <span style="white-space:pre"> </span>private DocumentBuilderFactory factory; <span style="white-space:pre"> </span>private DocumentBuilder builder; <span style="white-space:pre"> </span>private Document document; <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>@Before <span style="white-space:pre"> </span>public void before() throws Exception{ <span style="white-space:pre"> </span>//测试前得到Document模型对象 <span style="white-space:pre"> </span>this.factory = DocumentBuilderFactory.newInstance(); <span style="white-space:pre"> </span>this.builder = this.factory.newDocumentBuilder(); <span style="white-space:pre"> </span>this.document = this.builder.parse("src/Test.xml"); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>/** <span style="white-space:pre"> </span> * 创建新的XML元素节点,挂载在某个标签末尾 <span style="white-space:pre"> </span> * @throws Exception <span style="white-space:pre"> </span> */ <span style="white-space:pre"> </span>@Test <span style="white-space:pre"> </span>public void testCreateElement() throws Exception{ <span style="white-space:pre"> </span>//创建对象节点 <span style="white-space:pre"> </span>Element element = document.createElement("售价"); <span style="white-space:pre"> </span>//给对象节点设置内容 <span style="white-space:pre"> </span>element.setTextContent("29RMB"); <span style="white-space:pre"> </span>//得到对象节点的父节点 <span style="white-space:pre"> </span>Node parentNode = document.getElementsByTagName("书").item(0); <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>//父节点挂载对象节点 <span style="white-space:pre"> </span>parentNode.appendChild(element); <span style="white-space:pre"> </span>//将更新后的DOM对象,从内存写回到XML文件 <span style="white-space:pre"> </span>updateDOM(); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>/** <span style="white-space:pre"> </span> * 创建新的XML元素节点,在某个位置插入 <span style="white-space:pre"> </span> * @throws Exception <span style="white-space:pre"> </span> */ <span style="white-space:pre"> </span>@Test <span style="white-space:pre"> </span>public void testInsertElement() throws Exception{ <span style="white-space:pre"> </span>//创建对象节点 <span style="white-space:pre"> </span>Element element = document.createElement("页数"); <span style="white-space:pre"> </span>//给对象节点设置内容 <span style="white-space:pre"> </span>element.setTextContent("1000页"); <span style="white-space:pre"> </span>//得到要插入的的位置的参考元素,在其之前插入 <span style="white-space:pre"> </span>Element refChild = (Element) document.getElementsByTagName("售价").item(0); <span style="white-space:pre"> </span>//得到对象节点的父节点 <span style="white-space:pre"> </span>Node parentNode = document.getElementsByTagName("书").item(0); <span style="white-space:pre"> </span>//父节点在选择的位置进行插入 <span style="white-space:pre"> </span>parentNode.insertBefore(element, refChild); <span style="white-space:pre"> </span>//将更新后的DOM对象,从内存写回到XML文件 <span style="white-space:pre"> </span>updateDOM(); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>/** <span style="white-space:pre"> </span> * 删除某个标签元素 <span style="white-space:pre"> </span> * @throws Exception <span style="white-space:pre"> </span> */ <span style="white-space:pre"> </span>@Test <span style="white-space:pre"> </span>public void testDeleteElement() throws Exception{ <span style="white-space:pre"> </span>//得到要删除的节点对象 <span style="white-space:pre"> </span>Node node = document.getElementsByTagName("售价").item(0); <span style="white-space:pre"> </span>//得到该节点的父节点 <span style="white-space:pre"> </span>Node parentNode = node.getParentNode(); <span style="white-space:pre"> </span>//父节点删除该节点 <span style="white-space:pre"> </span>parentNode.removeChild(node); <span style="white-space:pre"> </span>//将更新后的DOM对象,从内存写回到XML文件 <span style="white-space:pre"> </span>updateDOM(); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>/** <span style="white-space:pre"> </span> * 查找某个标签元素所填充的内容 <span style="white-space:pre"> </span> */ <span style="white-space:pre"> </span>@Test <span style="white-space:pre"> </span>public void testReadTagContent(){ <span style="white-space:pre"> </span>//获得该标签的节点列表 <span style="white-space:pre"> </span>NodeList nodeList = document.getElementsByTagName("书名"); <span style="white-space:pre"> </span>//遍历节点列表,并获取标签填充内容后打印输出 <span style="white-space:pre"> </span>for (int i = 0; i < nodeList.getLength(); i++) { <span style="white-space:pre"> </span>Node item = nodeList.item(i); <span style="white-space:pre"> </span>String content = item.getTextContent(); <span style="white-space:pre"> </span>System.out.println(content); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>/** <span style="white-space:pre"> </span> * 改变标签的属性值 <span style="white-space:pre"> </span> * @throws Exception <span style="white-space:pre"> </span> */ <span style="white-space:pre"> </span>@Test <span style="white-space:pre"> </span>public void testReadTagAttr() throws Exception{ <span style="white-space:pre"> </span>//获得该标签的节点列表 <span style="white-space:pre"> </span>NodeList nodeList = document.getElementsByTagName("书"); <span style="white-space:pre"> </span>//遍历节点列表,并获取标签填充内容后打印输出 <span style="white-space:pre"> </span>for (int i = 0; i < nodeList.getLength(); i++) { <span style="white-space:pre"> </span>Element item =(Element) nodeList.item(i); <span style="white-space:pre"> </span>String attribute = item.getAttribute("name"); <span style="white-space:pre"> </span>item.setAttribute("name", "技术类丛书"); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>//更新DOM文档 <span style="white-space:pre"> </span>updateDOM(); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>/** <span style="white-space:pre"> </span> * 打印所有的标签名称 <span style="white-space:pre"> </span> */ <span style="white-space:pre"> </span>@Test <span style="white-space:pre"> </span>public void testReadTags(){ <span style="white-space:pre"> </span>//获取XML文档的根节点对象 <span style="white-space:pre"> </span>Node root = document.getElementsByTagName("商店").item(0); <span style="white-space:pre"> </span>//打印所有标签名称 <span style="white-space:pre"> </span>list(root); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>/** 打印XML文件的所有标签名称 <span style="white-space:pre"> </span> * @param node 节点对象 <span style="white-space:pre"> </span> */ <span style="white-space:pre"> </span>private void list(Node node) { <span style="white-space:pre"> </span>//判断该节点是否为元素类型,如果是则直接打印节点名称 <span style="white-space:pre"> </span>if(node instanceof Element){ <span style="white-space:pre"> </span>System.out.println(node.getNodeName()); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>//如果不是元素类型,那么继续获得子节点 <span style="white-space:pre"> </span>NodeList childNodes = node.getChildNodes(); <span style="white-space:pre"> </span>for (int i = 0; i < childNodes.getLength(); i++) { <span style="white-space:pre"> </span>Node child = childNodes.item(i); <span style="white-space:pre"> </span>list(child); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>/** <span style="white-space:pre"> </span> * 将更新后的DOM对象,从内存写回到XML文件 <span style="white-space:pre"> </span> * @throws Exception <span style="white-space:pre"> </span> */ <span style="white-space:pre"> </span>private void updateDOM() throws Exception { <span style="white-space:pre"> </span>TransformerFactory factory = TransformerFactory.newInstance(); <span style="white-space:pre"> </span>Transformer transformer = factory.newTransformer(); <span style="white-space:pre"> </span>transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/Test.xml"))); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>@After <span style="white-space:pre"> </span>public void after(){ <span style="white-space:pre"> </span>this.factory = null; <span style="white-space:pre"> </span>this.builder = null; <span style="white-space:pre"> </span>this.document = null; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span> }
XML文件:
<?xml version="1.0" encoding="UTF-8"?> <商店> <书 name="java 技术"> <书名>java核心技术</书名> <作者>Sun公司</作者> <日期>1011-12-13</日期> </书> <书 name="php 技术"> <书名>php核心技术</书名> <作者>apache公司</作者> <日期>2011-08-13</日期> </书> </商店>