JAXP技术解析XML文件

来源:互联网 发布:有道云笔记 ubuntu版 编辑:程序博客网 时间:2024/06/07 02:19
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</日期></书></商店>

0 0