XML学习笔记|第二章XML解析之JAXP

一:XML解析的简介

*xml是标记型文档 js是使用dom解析标记型文档。 js的解析过程:根据html的层级结构,在内存中分配一个树形结构,把html的标签,属性和文本都封装成对象

xml的解析方式:dom和sax

  • dom方式解析:根据xml的层级结构在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象。
    缺点:如果文件过大,造成内存溢出
    优点:很方便实现增删改操作
  • sax方式解析:
    采用事件驱动,边读边解析:从上到下,一行一行的解析,解析到某一个对象,返回对象名称
    缺点:不能实现增删改操作
    优点:如果文件过大不会造成内存溢出,方便实现查询操作
    画图分析:
    在这里插入图片描述
    如果解析xml,解析器。不同的公司和组织提供了针对dom和sax方式的解析器,通过api方式提供
  • sun公司提供了针对dom和sax的解析器 jaxp
  • domj组织提供了针对dom和sax的解析器 dom4j
  • jdom组织提供了针对dom和sax解析器 jdom

二:JASP的操作

1.查询节点

public class JsapText1 {
	public static void main(String[] args) throws ParserConfigurationException {
		/*
		 * 1.创建解析器工厂 2.根据解析器工厂创建解析器 3.解析xml返回document 4.得到所有的name元素
		 * 5.返回集合,遍历集合,得到每一个name元素
		 */
		// 创建解析器工厂
		DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
		// 根据解析器工厂创建解析器
		DocumentBuilder builder = builderFactory.newDocumentBuilder();
		// 解析xml返回document
		try {
			Document document = builder.parse("src/person.xml");
			// 得到name元素
			NodeList list = document.getElementsByTagName("name");
			for (int i = 0; i < list.getLength(); i++) {
				Node name1 = list.item(i);
				System.out.println(name1.getTextContent());
			}
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

2.增加节点

//在第一个p1下添加一个节点<sex></sex>
	public static void addSex() throws Exception {
		/*
		 * 1.创建解析器工厂
		 * 2.通过解析器工厂制造解析器
		 * 3.解析xml返回document
		 * 4.创建新增节点
		 * 5.添加几点
		 * 6.回写xml文件
		 */
		DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
		DocumentBuilder builder=builderFactory.newDocumentBuilder();
		Document document=builder.parse("src/person.xml");
		Node nodeP1=document.getElementsByTagName("p1").item(0);
		Element sex=document.createElement("sex");
		Text text1=document.createTextNode("女");
		sex.appendChild(text1);
		nodeP1.appendChild(sex);
		TransformerFactory transformerFactory=TransformerFactory.newInstance();
		Transformer transformer=transformerFactory.newTransformer();
		transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
	} 

3.修改节点

 //修改第一个sex节点下的值为男
	private static void modifySex() throws Exception {
		/*
		 * 1.使用解析器工厂创建解析器,解析xml文件
		 * 2.找到第一个sex节点
		 * 3.修改值
		 * 4.会写xml文件
		 */
		DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();
		DocumentBuilder documentBuilder =documentBuilderFactory.newDocumentBuilder();
		Document document=documentBuilder.parse("src/person.xml");
		Node node1=document.getElementsByTagName("sex").item(0);
		node1.setTextContent("男");
		TransformerFactory transformerFactory=TransformerFactory.newInstance();
		Transformer transformer=transformerFactory.newTransformer();
		transformer.transform(new DOMSource(document),new StreamResult("src/person.xml"));
	}
	

4.删除节点

//删除sex节点
	private static void delSex() throws Exception {
		/*
		 * 1.使用解析器工厂创建解析器,解析xml文件
		 * 2.找到第一个sex节点
		 * 3.找到sex的父节点,依靠父节点删除sex
		 * 4.会写xml
		 */
	
			DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();
			DocumentBuilder documentBuilder =documentBuilderFactory.newDocumentBuilder();
			Document document=documentBuilder.parse("src/person.xml");
			Node node1=document.getElementsByTagName("sex").item(0);
			Node node2=node1.getParentNode();
			node2.removeChild(node1);
			TransformerFactory transformerFactory=TransformerFactory.newInstance();
			Transformer transformer=transformerFactory.newTransformer();
			transformer.transform(new DOMSource(document),new StreamResult("src/person.xml"));
	}

5.遍历所有节点

//遍历节点,把所有节点元素获取到
	private static void listElement() throws Exception{
		/*
		 * 1.使用解析器工厂创建解析器,解析xml文件
		 * 2.使用递归操作遍历所有节点
		 */
		DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();
		DocumentBuilder documentBuilder =documentBuilderFactory.newDocumentBuilder();
		Document document=documentBuilder.parse("src/person.xml");
		list(document);
	}
	private static void list(Node node) {
		//判断node节点是不是元素类型,因为在xml中换行也是一个节点
		if(node.getNodeType()==Node.ELEMENT_NODE) {
			System.out.println(node.getNodeName()+":");
		}
		NodeList list=node.getChildNodes();
		for(int i=0;i<list.getLength();i++) {
			Node node1=list.item(i);
			list(node1);
		}		
	}
原创文章 114 获赞 84 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_44867340/article/details/105703941