XML(三):xml的解析技术:dom和sax

标签: xml

1. 解析过程图及优缺点

在这里插入图片描述

2.针对dom和sax的解析器

 1)JAXP  (sun公司提供)
 2)  dom4j  (dom4j组织提供,实际开发中用得最多)
 3)  jdom (很少用)

3.JAXP 使用

1)javax.xml.parsers包下有四个类:
DocumentBuilder和DocumentBuilderFactory、
SaxParser和SaxParserFactory
2)步骤:

	     1.创建解析器工厂
	     2.创建解析器
	     3.解析xml得到document对象
	     4.对xml进行增删改查
	     5.如果有增删改操作,要将内存的信息回写到xml中
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<person>
  <p1>
     <name color="red" id="1" style="heigh:30px" width="90">张三</name>
     <age id2="zs">30</age>
  </p1>
  <p1>
     <name color="pink" id="1" width="90">李思</name>
     <age id2="zs">25</age>
  </p1>
</person>
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
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.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;

public class JaxpTest {

	public static void main(String[] args) throws Exception{
		   
		//添加节点   创建节点标签:createElement 标签内容:createTextNode  添加节点 appendChild
		//addNode();	
		
		//修改节点  setTextContent
		//updateNode();
		
		//删除节点(节点不能自己删除自己,必须由父节点删除子节点) .getParentNode().removeChild(sex)
		//delNode();
			
		//使用递归遍历xml所有节点
		findAllNode();
		
	}
	
	
	//使用递归遍历所有节点
	private static void findAllNode() throws Exception {
		
		//解析xml
		Document document = getDocument("src/person.xml");
		
		NodeList(document);
	}

	private static void NodeList(Node node) {
		//System.out.println("node.getNodeType() :"+node.getNodeType() +"   "+node.ELEMENT_NODE);
		//判断是否是元素类型
		if(node.getNodeType() == node.ELEMENT_NODE)
		   System.out.println(node.getNodeName());
		
		//得到一层子节点
		NodeList nodeList= node.getChildNodes();
		for(int i=0;i<nodeList.getLength();i++){
			NodeList(nodeList.item(i));
		}
		
	}


	//删除节点
	private static void delNode() throws Exception {
		//需求:将sex节点删除  <sex>nan</sex>
        //解析xml
		Document document = getDocument("src/person.xml");
		//拿到sex节点
		Node sex= document.getElementsByTagName("sex").item(0);
		//根据节点拿到父节点  删除
		sex.getParentNode().removeChild(sex);
		
		//回写xml
		SaveXml(document,"src/person.xml");
	}

	//修改节点
	private static void updateNode() throws Exception {
		//需求:将sex内容改为nan   <sex>nv</sex>
        //解析xml
		Document document = getDocument("src/person.xml");
		//拿到sex节点
		Node sex= document.getElementsByTagName("sex").item(0);
		//修改内容
		sex.setTextContent("nan");
		
		//添加节点属性 id
	    Element sexElement = (Element)sex;
	    sexElement.setAttribute("id", "test");
	    
		//回写xml
		SaveXml(document,"src/person.xml");
	}

	//添加节点
	private static void addNode() throws Exception {
		//需求:在第一个p1上加上一个  <sex>nv</sex>
		
		//解析xml
		Document document = getDocument("src/person.xml");
		
		//拿到所有p1节点
		NodeList nodeList = document.getElementsByTagName("p1");
		//拿到第一个p1节点
		Node p1 = nodeList.item(0);
		
		//创建<sex>节点
		Element sex = document.createElement("sex");
		//创建节点内容
		Text text = document.createTextNode("nv");
		//将text添加到 sex节点下
		sex.appendChild(text);
		
		//将sex节点添加到p1节点下
		p1.appendChild(sex);
		
		//回写到xml中
		SaveXml(document,"src/person.xml");
	}

	//解析xml
	private static Document getDocument(String path) throws Exception {
		//创建解析器工厂
		DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();
		//创建解析器
		DocumentBuilder documentBuilder= documentBuilderFactory.newDocumentBuilder();
		//解析xml返回Document
		Document document=documentBuilder.parse(path);
		
		return document;
	}

	//回写xml
	private static void SaveXml(Document document,String path) throws Exception {
		// 获得持久化工厂实例
		TransformerFactory tfactory = TransformerFactory.newInstance();
		// 获得持久化对象
		Transformer transformer = tfactory.newTransformer();
		transformer.transform(new DOMSource(document), new StreamResult(path));
 
		System.out.println("xml回写写完成!!!");
	}

}

版权声明:本文为qq_40408712原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40408712/article/details/105462913