JAXP技术解析XML文件

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</日期>
	</书>
</商店>

猜你喜欢

转载自blog.csdn.net/franky814/article/details/42407737