XML解析——Jaxp解析器

目录


Jaxp解析器

跳转到目录

  • Jaxp解析器在jdk的javax.xml.parsers包内
    • 四个类: 分别针对DOM和SAX解析的类
    • DOM:
      • DocumentBuilder 解析器类
      • DocumentBuilderFactory解析器工厂类
    • SAX:
      • SAXParser 解析器类
      • SAXParserFactory 解析器工厂类

DOM解析XML

跳转到目录

  • DocumentBuilder

    • 这是一个抽象类,不能new
    • 这个类的实例可以从DocumentBuilderFactory.newDocumentBuilder()方法获取
    • 解析xml使用parse("xml文件路径")方法, 返回Document整个文档, document是一个接口,父节点是Node,如果在document接口中找不到的方法,可以在Node接口中找.
    • document的方法
      getElementsByTagName(String tagname) 返回一个标签集合 NodeList
      createElement(String tagName) 创建一个标签
      createTextNode(String data) 创建文本
      appendChild(Node newChild) 把节点添加到标签下
      removeChild(Node oldChild) 删除节点
      getParentNode() 获取父节点
    • NodeList的方法
      getLength() 得到集合的长度
      item(int index) 下表取到具体的值
      getTextContent() 得到标签里的内容
  • DocumentBuilderFactory

  1. 抽象类
  2. 通过newInstance()获取DocumentBuilderFactory的实例.
Jaxp查询操作

跳转到目录

// 查询所有name元素的值
	private static void selectAll() throws Exception {
		// 查询所有name元素的值
		/*
		 * 1. 创建解析器工程
		 * 2. 根据解析器工厂创建解析器
		 * 3. 解析xml返回document
		 * 
		 * */
		// 创建解析器工厂
		DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
		// 创建解析器
		DocumentBuilder builder = builderFactory.newDocumentBuilder();
		// 解析xml返回document
		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);
			// 得到name元素里面的值
			String string = name1.getTextContent();
			System.out.println(string);
		}
	}
Jaxp添加节点操作

跳转到目录

// 在第一个p1下添加一个sex节点
	public static void addSex() throws Exception{
		/*
		 * 1. 创建解析器工程
		 * 2. 根据解析器工厂创建解析器
		 * 3. 解析xml返回document
		 * 4. 得到第一个p1, 得到所有的p1,通过item下标获取
		 * 5. 创建sex标签 createElement
		 * 6. 创建文本 createTextNode
		 * 7. 把文本添加到sex下面appendChild
		 * 8. 把sex添加到第一个p1下面
		 * 9. 回写xml操作
		 * */
		DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = builderFactory.newDocumentBuilder();
		Document document = builder.parse("src/person.xml");
		NodeList list = document.getElementsByTagName("p1");
		Node pNode = list.item(0);
		// 创建sex标签
		Element sexElement = document.createElement("sex");
		// 创建文本
		Text textElemenText = document.createTextNode("nv");
		// 把文本添加到sexElement下面
		sexElement.appendChild(textElemenText);
		// 把sexElement添加到p1下面
		pNode.appendChild(sexElement);
		// 回写xml
		TransformerFactory transformerFactory = TransformerFactory.newInstance();
		Transformer transformer = transformerFactory.newTransformer();
		transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
	}
Jaxp修改节点内容

跳转到目录

// 修改sex节点的内容
	public static void modifySex() throws Exception{
		/*
		 * 1. 创建解析器工程
		 * 2. 根据解析器工厂创建解析器
		 * 3. 解析xml返回document
		 * 4. 得到sex item方法
		 * 5. 修改sex里面的值 sexTextContent方法
		 * 6. 回写xml操作
		 * */
		DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = builderFactory.newDocumentBuilder();
		Document document = builder.parse("src/person.xml");
		Node sex = document.getElementsByTagName("sex").item(0);
		// 修改sex值
		sex.setTextContent("nan");
		// 回写xml
		TransformerFactory transformerFactory = TransformerFactory.newInstance();
		Transformer transformer = transformerFactory.newTransformer();
		transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
	}
Jaxp删除节点

跳转到目录

// 删除sex节点
	public static void deleteSex() throws Exception{
		/*
		 * 1. 创建解析器工程
		 * 2. 根据解析器工厂创建解析器
		 * 3. 解析xml返回document
		 * 4. 得到sex元素
		 * 5. 获取sex的父节点 使用getParentNode方法
		 * 6. 使用父节点来删除sex节点, 使用removeChild方法
		 * 6. 回写xml操作
		 * */
		DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = builderFactory.newDocumentBuilder();
		Document document = builder.parse("src/person.xml");
		Node sex = document.getElementsByTagName("sex").item(0);
		Node sexParentNode = sex.getParentNode();
		sexParentNode.removeChild(sex);
		// 回写xml
		TransformerFactory transformerFactory = TransformerFactory.newInstance();
		Transformer transformer = transformerFactory.newTransformer();
		transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
	}
遍历xml中的所有节点

跳转到目录

// 遍历xml中的所有节点
	public static void bianliList() throws Exception{
		DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = builderFactory.newDocumentBuilder();
		Document document = builder.parse("src/person.xml");
		list1(document);
	}

	// 递归操作
	public static void list1(Node node) {
		// 判断是元素类型才打印
		if (node.getNodeType() == Node.ELEMENT_NODE) {
			System.out.println(node.getNodeName());
		}
		
		// 得到一层子节点
		NodeList list = node.getChildNodes();
		// 遍历list
		for (int i = 0; i < list.getLength(); i++) {
			// 得到每一个节点
			Node node1 = list.item(i);
			// 递归操作
			list1(node1);
		}
	}

SAX解析XML

跳转到目录

  • SAXParser
    • 此类的实例可以从 SAXParserFactory.newSAXParse()方法获取
    • 解析xml使用parse​(File f, DefaultHandler dh) arg1: xml路径 arg2: 事件处理器
  • SAXParserFactory
    • newInstance()方法得到
  • DefaultHandler
    • void startElement​(String uri, String localName, String qName, Attributes attributes) 接收元素开始的通知。 qName 返回标签名称.
    • void characters​(char[] ch, int start, int length) 接收元素内的字符数据通知。
    • void endElement​(String uri, String localName, String qName) 接收元素结尾的通知。

在这里插入图片描述

  • 当解析到开始标签的时候, 自动执行startElement方法
  • 当解析到文本的时候, 自动执行characters方法
  • 当解析到结束标签时候, 自动执行endElement方法
Demo

跳转到目录
TestSax.java

public class TestSax {

	public static void main(String[] args) throws Exception{
		
		/*
		 * 1. 创建解析器工厂
		 * 2. 创建解析器
		 * 3. 执行parse方法
		 * 4. 自己创建一个类, 继承DefaultHandler
		 * 5 重写类中的三个方法
		 * 
		 * */
		
		// 创建解析器工厂
		SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
		// 创建解析器
		SAXParser saxParser = saxParserFactory.newSAXParser();
		// 执行parse方法
		saxParser.parse("src/zy.xml", new MyDefaultHandler());
		
	}
}

MyDefaultHandler.java

package com.sunny.jaxptest;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class MyDefaultHandler extends DefaultHandler{

	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		System.out.print("<"+qName+">");
	}
	
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		System.out.print(new String(ch, start, length));
	}

	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		System.out.print("</"+qName+">");
	}
}

发布了149 篇原创文章 · 获赞 68 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/m0_37989980/article/details/103751501