DOM解析xml

解析xml如下

<?xml version="1.0" encoding="UTF-8"?>
<BookStore> 
  <myBook NO="1"> 
    <Book> 
      <BookName ID="A001">JAVA</BookName>  
      <love>I love you</love>
      <Author>Jack</Author>  
      <Price>110</Price>  
      <City>nanjing</City> 
    </Book>  
    <Book> 
      <BookName ID="A002">android</BookName>  
      <Author>Lucy</Author>  
      <Price>20</Price> 
    </Book> 
  </myBook> 
</BookStore>

  

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.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;

//优点:增删改查容易
//缺点:内存消耗较大,直接把XML封装成对象如果XML有1G,直接加入到内存中,可能会造成内存泄漏
        //1:创建文档构建的工厂
		//2:获得dom解析器
		//3:解析xml文档,得到代表文档的document
       //DOM getElementsByTagName()获取元素,在进行相关操作
       //Dom4j document.getRootElement()...element().elements()..;
/*
 * <?xml version="1.0" encoding="utf-8"?>
<BookStore>
    <Book>
         <BookName>JAVA</BookName>
         <Author>Jack</Author>
         <Price>110<Price> 
    </Book>
    <Book>
         <BookName>android</BookName>
         <Author>simant</Author>
         <Price>200<Price> 
    </Book>
</BookStore>
*/

/*
 * DOM方法解析xml
 */
public class DOM {

	@Test
	public void test1()throws Exception
	{
		//1:创建工厂
		DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
		//2:获得dom解析器
		DocumentBuilder build=factory.newDocumentBuilder();
		//3:解析xml文档,得到代表文档的document
	    Document document=build.parse("src/book.xml");	
	}
    @Test
    public void read()throws Exception
    {
    	//读取<BookName>android</BookName>中的值android
    	DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
		DocumentBuilder build=factory.newDocumentBuilder();
	    Document document=build.parse("src/book.xml");
	    
	    NodeList list = document.getElementsByTagName("BookName");//表示获取BooKName标签的所有节点list
	    Node node=list.item(1);//表示获取第二个BooKName的节点
	    String content=node.getTextContent();
	    System.out.println(content);
	}
    @Test
    public void read1()throws Exception
    {
    	// <BookName ID="A001">JAVA</BookName>获得指定标签的属性
    	DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
		DocumentBuilder build=factory.newDocumentBuilder();
	    Document document=build.parse("src/book.xml");
    	
	   Node node=document.getElementsByTagName("BookName").item(0);
	   NamedNodeMap s= node.getAttributes();
	   System.out.println(s.getNamedItem("ID"));
	   
    }
    @Test
    public void add()throws Exception
    {
    	//创建节点<City>nanjing</City>
    	DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
		DocumentBuilder build=factory.newDocumentBuilder();
	    Document document=build.parse("src/book.xml");
	    
	    //创建节点
	    Element  element=document.createElement("City");
	    element.setTextContent("nanjing");
	    
	    //把创建的节点放在第一本书上
	    Element list=(Element) document.getElementsByTagName("BookName").item(0);
	    list.appendChild(element);
	    
	    //把更新后的内存写入xml文档
	    TransformerFactory factory2=TransformerFactory.newInstance();
	    Transformer tran=factory2.newTransformer();
	    tran.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml")));
	    
    }
   
    @Test
    public void delete()throws Exception
    {
    	//删除节点 第二本书的作者<Author>Lucy</Author>
    	DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
		DocumentBuilder build=factory.newDocumentBuilder();
	    Document document=build.parse("src/book.xml");
	    
	    //得到要删除的element
	  Node Childnode=document.getElementsByTagName("Author").item(1);
	  
	  /*  //得到要删除节点的父节点
	  Node Parentnode=document.getElementsByTagName("BooK").item(1);
	  Parentnode.removeChild(Childnode);
	  */
	  
	  Childnode.getParentNode().removeChild(Childnode);//等价于上面删除
	  
	  //Childnode.getParentNode().getParentNode().getParentNode().removeChild(Childnode.getParentNode().getParentNode());//删掉所有
	    
	    //把更新后的内存写入xml文档
	    TransformerFactory factory2=TransformerFactory.newInstance();
	    Transformer tran=factory2.newTransformer();
	    tran.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml")));
	    
    }
    @Test
    public void update()throws Exception
    {
    	//  <Price>200</Price> 对第二本书的价格进行更改为20
    	DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
		DocumentBuilder build=factory.newDocumentBuilder();
	    Document document=build.parse("src/book.xml");
	    
          	    
	   Node node=document.getElementsByTagName("Price").item(1);
	   node.setTextContent("20");
	    
    	//把更新后的内存写入xml文档
	    TransformerFactory factory2=TransformerFactory.newInstance();
	    Transformer tran=factory2.newTransformer();
	    tran.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml")));
	    
    } 
}

  

原文地址:https://www.cnblogs.com/linhong/p/4392913.html