Xml语法分析

解析Xml文档:

Xml文档解析有dom解析,Sax解析,dom解析优点是可以对Xml文档进行增删改查,缺点就是内存占用比较大,而sax解析只能读Xml文档,但是占用内存小,读取快。

dom解析分为三步:

1.创建一个DocumentBuilderFactory

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

2.得到dom解析器

DocumentBuilder builder = factory.newDocumentBuilder();


3.解析Xml文档,得到代表文档的document

Document document = builder.parse(“xml文件位置”);


将生成的document的文档存入内存:

TransformerFactory ttfactory = TransformerFactory.newInstance();
Transformer tf = ttfactory.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/Exam.xml")));


对xml文档的增删改查:

package 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.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


public class Demo1 {

	@Test
	public void read1() throws Exception{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document document = builder.parse("src/Xml/MyXml.xml");
		
		NodeList list = document.getElementsByTagName("书名");
		Node node = list.item(1);
		String content = node.getTextContent();
		System.out.println(content);
	}
	
	@Test
	public void read2() throws Exception{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document document = builder.parse("src/Xml/MyXml.xml");
		
		Node root = document.getElementsByTagName("书架").item(0);
		
		list(root);
		
	}

	private void list(Node root) {
		if(root instanceof Element){
			System.out.println(root.getNodeName());
		}
	//	System.out.println(root.getNodeName());
		NodeList list = root.getChildNodes();
		for(int i=0;i<list.getLength();i++){
			Node child = list.item(i);
			list(child);//递归了
		}
	}
	
	@Test
	public void read3() throws Exception{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document document = builder.parse("src/Xml/MyXml.xml");
		
		Element root = (Element) document.getElementsByTagName("书名").item(0);
		
		String bookname = root.getAttribute("name");
		System.out.println(bookname);
	}
	
	
	//增
	@Test
	public void add() throws Exception{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document document = builder.parse("src/Xml/MyXml.xml");
		
	    Element price = document.createElement("售价");
	    price.setTextContent("59.00元");
	    
	    //把结点挂在"书"结点下
	    Element book = (Element) document.getElementsByTagName("书").item(0);
	    book.appendChild(price);
	    
	    TransformerFactory ttfactory = TransformerFactory.newInstance();
	    Transformer tf = ttfactory.newTransformer();
	    tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/Xml/MyXml.xml")));
	    
	}
	
	@Test
	public void add1() throws Exception{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document document = builder.parse("src/Xml/MyXml.xml");
		
		//得到创建结点
	    Element price = document.createElement("售价");
	    price.setTextContent("59.00元");
	    
	    Element refNode = (Element) document.getElementsByTagName("售价").item(0);
	    
	    //把结点挂在"书"结点下
	    Element book = (Element) document.getElementsByTagName("书").item(0);
	    book.insertBefore(price, refNode);
	    
	    
	    //把更改后的文件写入内存
	    TransformerFactory ttfactory = TransformerFactory.newInstance();
	    Transformer tf = ttfactory.newTransformer();
	    tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/Xml/MyXml.xml")));
	    
	}
	
	@Test
	public void addAttr() throws Exception{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document document = builder.parse("src/Xml/MyXml.xml");
	    
	    Element bookname = (Element) document.getElementsByTagName("书名").item(0);
	    bookname.setAttribute("name", "xxx");
	    
	    
	    //把更改后的文件写入内存
	    TransformerFactory ttfactory = TransformerFactory.newInstance();
	    Transformer tf = ttfactory.newTransformer();
	    tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/Xml/MyXml.xml")));
	    
	}
	
	//删
	@Test
	public void delte() throws Exception{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document document = builder.parse("src/Xml/MyXml.xml");
		
		Element book = (Element) document.getElementsByTagName("书").item(0);
		
		Element price = (Element) document.getElementsByTagName("售价").item(0);
		book.removeChild(price);
		
		
		 //把更改后的文件写入内存
	    TransformerFactory ttfactory = TransformerFactory.newInstance();
	    Transformer tf = ttfactory.newTransformer();
	    tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/Xml/MyXml.xml")));
	}
	
	@Test
	public void delte1() throws Exception{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document document = builder.parse("src/Xml/MyXml.xml");
		
		Element e = (Element) document.getElementsByTagName("售价").item(0);
		//删除所在结点所在的书
		e.getParentNode().getParentNode().removeChild(e.getParentNode());
		
		 //把更改后的文件写入内存
	    TransformerFactory ttfactory = TransformerFactory.newInstance();
	    Transformer tf = ttfactory.newTransformer();
	    tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/Xml/MyXml.xml")));
	}
	
	@Test
	public void update() throws Exception{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document document = builder.parse("src/Xml/MyXml.xml");
		
		Element e = (Element) document.getElementsByTagName("售价").item(0);
		e.setTextContent("109.00元");
		
		 //把更改后的文件写入内存
	    TransformerFactory ttfactory = TransformerFactory.newInstance();
	    Transformer tf = ttfactory.newTransformer();
	    tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/Xml/MyXml.xml")));
	}
}


<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<书架>
   <书>
        <书名 name="xxx">JavaWeb开发教程</书名>
        <作者>张孝祥</作者>
        <售价>59</售价>
        <售价>34</售价>
   </书>
   
   <书>
        <书名>JavaScript开发教程</书名>
        <作者>黎活明</作者>
        <售价>25</售价>
   </书>
</书架>


你可能感兴趣的:(Xml语法分析)