dom解析方式对xml文档进行操作



<span style="font-size:14px;"><?xml version="1.0" encoding="utf-8" standalone="no"?><书架>
			  <书>
			  	  <书名 name="xxx">java就业培训教程</书名>
			  	  <作者>张孝祥</作者>
			  	  <售价>36.2元</售价>
	   		 </书> 
			  
			   <书>
			  	  <书名>javascript就业培训教程</书名>
			  	  <作者>张孝祥</作者>
			  	  <售价>36.2元</售价>
			  </书>  
		 
</书架></span>



<span style="font-size:14px;">package com.rj.xml;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

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.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.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

//使用dom方式对xml文档进行crud
public class Demo01 {

	//读取xml文档中:  <书名>javascript就业培训教程</书名> 节点的值
	@Test
	public void read1() throws Exception{
		//1.创建工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
	
		//2.得到dom解析器
		DocumentBuilder builder = factory.newDocumentBuilder();
	
		//解析xml文档,得到代表文档的document对象
		Document document = builder.parse("src/book.xml"); 
		
		NodeList nodeList = document.getElementsByTagName("书名");//通过书名,查找所有书名的节点,即元素
		Node node = nodeList.item(1); //返回集合中的第 index 个项。
		String content = node.getTextContent();//返回节点中内容
		System.out.println(content); 
	}
	/*
	 * dom解析下,xml文档的每一个组成部分都会用一个对象表示,例如标签用Element,属性用Attr,
	 * 但不管什么对象,都是Node的子类,所以在开发中可以把获取到的任意结点都当作Node对待.
	 * */
	
	//得到xml中的所有标签
	@Test
	public void read2() throws Exception{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document document = builder.parse("src/book.xml"); 
		
		//得到根节点
		NodeList  nodeList = document.getElementsByTagName("书架");
		Node root = nodeList.item(0);
		//或者直接 document.getElementsByTagName("书架").item(0);
		
		list(root);//递归过去所有节点
		
	}

	private void list(Node node) {
		
		if(node instanceof Element){
			System.out.println(node.getNodeName());
		}
		
		NodeList list = node.getChildNodes();//获取此结点下一层的所有结点,包括空格
	//	System.out.println(list.getLength());
		for(int i=0;i<list.getLength();i++){
			Node child = list.item(i);
			list(child);
		}
	
	}
	
	//得到xml中文档属性的值: <书名 name="xxx">java就业培训教程</书名>
		@Test
		public void read3() throws Exception{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document document = builder.parse("src/book.xml"); 
			 
			/*
			Node node = document.getElementsByTagName("书名").item(0);
			NamedNodeMap namedNodeMap = node.getAttributes(); 
			System.out.println(namedNodeMap.getNamedItem("name").getTextContent());
			当NamedNodeMap有多个的时候遍历比较麻烦,因此从他的子类Element这个类中找方法直接获取值
			*/
			
			Element bookname =   (Element) document.getElementsByTagName("书名").item(0);
			 String value = bookname.getAttribute("name");
			 System.out.println(value);
		}
		
		//向xml中添加节点:第一本书中添加 <售价>50.0元</售价>
		@Test
		public void add01() throws Exception{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document document = builder.parse("src/book.xml");
		
			
			/*
			 * 插入这个数据,先获取他的上一层的节点,利用他的节点,插入
			 * 创建节点时候,先创建再填充内容
			 * */
			//创建节点
			Element price = document.createElement("售价");
			price.setTextContent("50.0元");
			
			//把创建的节点挂到第一本书上
			Element book = (Element) document.getElementsByTagName("书").item(0);
			book.appendChild(price);
			
			
			/*
			 * 更新xml文档
			 * javax.xml.transform包中的Tranformer类用于把代表XML文件的Document对象转换为某种格式后进行输出
			 * 例如:把xml文件应用样式表后转成一个html文档,利用这个对象,当然也可以把Document对象由重新写入一个XML文件中。
			 * 
			 * Tranformer类通过transform方法完成转化操作,该方法接收一个源和一个目的地.
			 * 我们可以通过:
			 *   javax.xml.transform.dom.DOMSource类来关联要转换的document对象
			 *   用javax.xml.transform.stream.StreamResult对象来表示数据的目的地
			 *   
			 *   Tranformer对象通过TransformFactory获得
			 * 
			 * */
			
			/*
			 * Transformer获取,用工厂类TransformerFactory中的静态方法--
			 * static TransformerFactory newInstance() 
          		 获取 TransformerFactory 的新实例。 
          		
          		TransformerFactory中的方法:得到Transformer对象
          		abstract  Transformer newTransformer() 
          	创建执行从 Source 到 Result 的复制的新 Transformer。 
          
			 * Transformer抽象类里面有这样一个方法
			 * abstract  void transform(Source xmlSource, Result outputTarget) 
          	 *	将 XML Source 转换为 Result。 
			 *
			 * 怎么通过Source的对象获取document对象-->Source的接口实现类DOMSource的构造方法
			 * DOMSource(Node n) 
          	    创建带有 DOM 节点的新输入源。
			 * 
			 * Result的接口实现类StreamResult中的构造方法:
			 * StreamResult(OutputStream outputStream) 
          	         从字节流构造 StreamResult。
			 * */
			//更新后内存写回到xml文档中
			TransformerFactory transformerFactory = TransformerFactory.newInstance();
			Transformer transformer = transformerFactory.newTransformer();
			transformer.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml"))) ;
		
		}
		
		//在指定位置插入元素 <售价>36.2元</售价>节点之前
		@Test
		public void add02() throws Exception{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document document = builder.parse("src/book.xml"); 
			
			//创建节点
			Element price = document.createElement("售价");
			price.setTextContent("59.9元");
			
			//得到参考节点
			Element refNode = (Element) document.getElementsByTagName("售价").item(0);
		
			//得到要挂崽的节点,即参考节点的上一层的节点
			Element book = (Element) document.getElementsByTagName("书").item(0);
			
			//往book的指定位置插崽,即插入参考节点
			book.insertBefore(price,refNode);
			
			//更新xml
			TransformerFactory transformerFactory = TransformerFactory.newInstance();
			Transformer transformer = transformerFactory.newTransformer();
			transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
			} 
		
		
		
		//向xml文档中添加属性: <书名>java就业培训教程</书名>--> name="xxx"
		@Test
		public void addAttr() throws Exception{
			 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
			 DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder();
			 Document document = builder.parse("src/book.xml");
			 
			 Element bookname = (Element) document.getElementsByTagName("书名").item(0);
			 bookname.setAttribute("name", "xxx");
			 
			 TransformerFactory transformerFactory = TransformerFactory.newInstance();
			 Transformer transformer = transformerFactory.newTransformer();
			 transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
		} 
		
		
		//删除第一个书名节点的售价:<售价>36.2元</售价>
		@Test
		public void delete1() throws Exception{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document document = builder.parse("src/book.xml");
			
			//得到要删除的节点
			Element e = (Element) document.getElementsByTagName("售价").item(0);
			
			//得到要删除节点的爸爸
			 Element book = (Element) document.getElementsByTagName("书").item(0);
			
			 //爸爸想删除
			 book.removeChild(e);
			 
			 //更新结果集
			 TransformerFactory transformerFactory = TransformerFactory.newInstance();
			 Transformer transformer = transformerFactory.newTransformer();
			 transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
		}
		 

          //删除  <售价>36.2元</售价>的父亲节点
		@Test
		public void delete2() throws Exception{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document document = builder.parse("src/book.xml");
			
			//得到要删除的节点
			//e.getParentNode()-->获取此节点的父亲节点
			Element e = (Element) document.getElementsByTagName("售价").item(0);
			e.getParentNode().getParentNode().removeChild(e.getParentNode());
			//删除所有节点
			//记住根节点的爸爸是document
			 //e.getParentNode().getParentNode().getParentNode().removeChild(e.getParentNode().getParentNode());
		 
		 
			 //更新结果集
			 TransformerFactory transformerFactory = TransformerFactory.newInstance();
			 Transformer transformer = transformerFactory.newTransformer();
			 transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
		}
		
		
		
		
		//跟新售价 <售价>36.2元</售价>-->100元
		@Test
		public void update() throws Exception{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document document = builder.parse("src/book.xml");
			
			Element e = (Element) document.getElementsByTagName("售价").item(0);
			e.setTextContent("100元");
			 //更新结果集
			 TransformerFactory transformerFactory = TransformerFactory.newInstance();
			 Transformer transformer = transformerFactory.newTransformer();
			 transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
		}
	 }

		 
	 
</span>


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值