`
mw08091020
  • 浏览: 14705 次
  • 性别: Icon_minigender_1
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

利用JAXP方式对XML解析

 
阅读更多

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


分享到:
评论

相关推荐

    java解析xml及4种常用解析比较

    然而由于使用DOM解析器的时候需要处理整个XML文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。 SAX解析器采用了基于事件的...

    Dom4j 解析XML

    与利用DOM、SAX、JAXP机制来解析xml相比,DOM4J 表现更优秀,具有性能优异、功能强大和极端易用使用的特点,只要懂得DOM基本概念,就可以通过dom4j的api文档来解析xml。dom4j是一套开源的api。实际项目中,往往选择...

    web开发常用jar

    web开发常用jar包 常用jar包 commons-beanutils.jar Apache Commons包中的一个,包含了一些Bean工具类类。必须使用的jar包。...Xerces是XML解析器,Xalan是格式化器,xml-apis实际上是JAXP。 sitemesh.jar

    java开发常用jar包

    Xerces是XML解析器,Xalan是格式化器,xml-apis实际上是JAXP。 sitemesh.jar Sitemesh 是一个基于WEB页面的布局、装饰以及应用整合的开源框架。它能帮助我们在由大量页面构成的项目中创建一致的页面布局和外观,...

    超级有影响力霸气的Java面试题大全文档

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    java开源包1

    利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类...

    java开源包11

    利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类...

    java开源包2

    利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类...

    java开源包3

    利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类...

    java开源包6

    利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类...

    java开源包5

    利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类...

    java开源包10

    利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类...

    java开源包4

    利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类...

    java开源包8

    利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类...

    java开源包7

    利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类...

    java开源包9

    利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类...

    JAVA上百实例源码以及开源项目

     通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...

    java开源包101

    利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类...

    Java资源包01

    利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类...

Global site tag (gtag.js) - Google Analytics