JAXP对XML的DOM解析(增删改查)

DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。 DOM 以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。DOM使用起来 也要简单得多。

下面列出实例,首先是需要操作的XML文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><书架>
	<书 name="XXX">
		<书名>java编程思想4</书名>	
	 	<售价>39</售价>
	</书>
	<书>
		<书名>java编程思想2</书名>
		<作者>BBB</作者>
		<售价>0</售价>
	</书>
</书架>
接下来是JAXP对XML的操作

import java.io.File;
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.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class XmlParserDemo {
	/**
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		// 新建一个DocumentBuilderFactory 解析器工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		// 通过解析器工厂产生一个解析器对象
		DocumentBuilder builder = factory.newDocumentBuilder();
		// 解析器对象有一个parse的方法可以读进来一个xml文件
		// 读到的xml文件是以document对象的方式保存在内存中的
		Document document = builder.parse("src/book.xml");
		// listAllNode(document);
		//listAllNode1(document);
		readElement(document);
		//update(document);
		//readAttribute(document);
		//add(document);
		//add1(document);
		//delete(document);
		//removeAttribute(document);
		//addAttribute(document);
		//updateAttribute(document);
	}
	
	//打印所有节点的名字
	public static void listAllNode(Node node) {
		System.out.println(node.getNodeName());
		NodeList list = node.getChildNodes();
		for (int i = 0; i < list.getLength(); i++) {
			Node child = list.item(i);
			listAllNode(child);
		}
	}
	//打印所有元素节点的名字
	public static void listAllNode1(Node node) {
		if (node.getNodeType() == Node.ELEMENT_NODE) {
			System.out.println(node.getNodeName());
		}
		NodeList list = node.getChildNodes();
		for (int i = 0; i < list.getLength(); i++) {
			Node child = list.item(i);
			listAllNode1(child);
		}
	}
	//读取某个xml元素的内容
	public static void readElement(Document document)
	{
		NodeList list= document.getElementsByTagName("书名");
		Node node= list.item(0);
		System.out.println(node.getTextContent());
	}
	//读取某个xml元素的属性
	public static void readAttribute(Document document)
	{
		NodeList list= document.getElementsByTagName("书");
		Node node= list.item(0);
		NamedNodeMap map= node.getAttributes();
		for(int i=0;i<map.getLength();i++)
		{
			Node attr = map.item(i);
			System.out.println(attr.getNodeName()+"="+attr.getNodeValue());
		}
	}
	//增加一个标签
	public static void add(Document document) throws Exception
	{
		//首先要创建一个标签
		Node node= document.createElement("售价");
		node.setTextContent("39");
		//把标签挂到根节点上去
		Node price =document.getElementsByTagName("书").item(0);
		price.appendChild(node);
		
		
		//通过transformer方法把一个内存中的document写到文件中去
		TransformerFactory factory= TransformerFactory.newInstance();
		Transformer trans= factory.newTransformer();
		trans.transform(new DOMSource(document) , new StreamResult(new File("src/book.xml")) );
	}
	//在中间创建一个标签
	public static void add1(Document document) throws Exception
	{
		//首先要创建一个标签
		Node node= document.createElement("作者");
		node.setTextContent("AAA");
		//把标签挂到根节点上去
		Node author =document.getElementsByTagName("书").item(0);
		author.insertBefore(node,document.getElementsByTagName("售价").item(0) );
		
		
		//通过transformer方法把一个内存中的document写到文件中去
		TransformerFactory factory= TransformerFactory.newInstance();
		Transformer trans= factory.newTransformer();
		trans.transform(new DOMSource(document) , new StreamResult(new File("src/book.xml")) );
	}
	
	//删除某个标签 。
	public static void delete(Document document) throws Exception
	{
		//先找到要删除的节点
		Node author= document.getElementsByTagName("作者").item(0);
		//通过这个节点找到他的父亲节点,再通过父亲节点删除当前节点
		author.getParentNode().removeChild(author);
		//新建一个transformer工厂类
		TransformerFactory factory= TransformerFactory.newInstance();
		//通过transformer的一个静态方法得到transformer的一个实例类
		Transformer trans= factory.newTransformer();
		//transformer实例类有一个写的方法 把内存中的文件写到硬盘上 从source到result
		trans.transform(new DOMSource(document) , new StreamResult(new File("src/book.xml")) );
	}
	
	//更改某个标签
	public static void update(Document document) throws Exception
	{
		Node node= document.getElementsByTagName("书名").item(0);
		node.setTextContent("数据结构");
		TransformerFactory factory= TransformerFactory.newInstance();
		Transformer trans= factory.newTransformer();
		trans.transform(new DOMSource(document), new StreamResult(new File("src/book.xml")) );
	}
	
	//删除某个属性
	public static void removeAttribute(Document document) throws Exception
	{
		Element element= (Element)document.getElementsByTagName("书").item(0);
		element.removeAttribute("name");
		TransformerFactory factory= TransformerFactory.newInstance();
		//通过transformer的一个静态方法得到transformer的一个实例类
		Transformer trans= factory.newTransformer();
		//transformer实例类有一个写的方法 把内存中的文件写到硬盘上 从source到result
		trans.transform(new DOMSource(document) , new StreamResult(new File("src/book.xml")) );
	}
	//增加某个属性
	public static void addAttribute(Document document) throws Exception
	{
		Attr att= document.createAttribute("name");
		att.setTextContent("AAA");
		Element element= (Element)document.getElementsByTagName("书").item(0);
		element.setAttributeNode(att);
		TransformerFactory factory= TransformerFactory.newInstance();
		//通过transformer的一个静态方法得到transformer的一个实例类
		Transformer trans= factory.newTransformer();
		//transformer实例类有一个写的方法 把内存中的文件写到硬盘上 从source到result
		trans.transform(new DOMSource(document) , new StreamResult(new File("src/book.xml")) );
	}
	
	//更新某个属性
	public static void updateAttribute(Document document) throws Exception
	{
		Element element= (Element)document.getElementsByTagName("书").item(0);
		element.setAttribute("name", "bbb");
		TransformerFactory factory= TransformerFactory.newInstance();
		Transformer trans= factory.newTransformer();
		trans.transform(new DOMSource(document), new StreamResult(new File("src/book.xml")));
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值