jaxp是javase的一部分
jaxp解析器在jdk的javax.xml.parsers包里面
四个类:分别是针对dom和sax解析使用的类
dom:
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 list getLength() 得到集合的长度 item(int index)下标取到具体的值
- getTextContent(),得到标签里面的内容
DocumentBuilderFactory: 解析器工厂,这个类也是一个抽象类,不能new,newInstance() 获取 DocumentBuilderFactory 的实例。
案例:
- <?xml version="1.0" encoding="utf-8" standalone="no"?>
- <person>
- <p1>
- <name>张三</name>
- <age>20</age>
- </p1>
- <p1>
- <name>李四</name>
- <age>30</age>
- </p1>
- </person>
- package com.java.xml;
- import java.io.IOException;
- import javax.xml.parsers.DocumentBuilder;
- import javax.xml.parsers.DocumentBuilderFactory;
- import javax.xml.parsers.ParserConfigurationException;
- import javax.xml.transform.Transformer;
- import javax.xml.transform.TransformerException;
- 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;
- import org.xml.sax.SAXException;
- public class TestJaxp {
- public static void main(String[] args)
- throws ParserConfigurationException,SAXException,IOException,TransformerException {
- // selectAll();
- // selectSingle();
- // addSex();
- // modifySex();
- // deleteSex();
- listElements();
- }
- /**
- * 查询所有name元素的值
- * @throws ParserConfigurationException
- * @throws IOException
- * @throws SAXException
- */
- public static void selectAll() throws ParserConfigurationException,IOException {
- /*
- * 1.创建解析器工厂
- * 2.根据解析器工厂创建解析器
- * 3.解析xml返回document
- * 4.得到所有的name元素
- * 5.返回集合,遍历集合
- */
- //创建解析器工厂
- 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++) {
- //得到每一个name元素
- Node name1 = list.item(i);
- String s = name1.getTextContent();
- System.out.println(s);
- }
- }
- /**
- * 查询xml第一个name元素的值
- * @throws ParserConfigurationException
- * @throws IOException
- * @throws SAXException
- */
- public static void selectSingle() throws ParserConfigurationException,IOException {
- /**
- * 1.创建解析器工厂
- * 2.根据解析器工厂创建解析器
- * 3.解析xml返回document
- * 4.得到所有的name元素
- * 5.使用返回集合里面的方法item,根据下标获取具体的元素
- * 6.得到具体的值,使用getTextContent()方法
- */
- //创建解析器工厂
- DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
- //创建解析器
- DocumentBuilder builder = builderFactory.newDocumentBuilder();
- //解析xml得到document
- Document document = builder.parse("src/person.xml");
- //得到所有的name元素
- NodeList list = document.getElementsByTagName("name");
- //使用下标得到第一个name元素
- Node name1 = list.item(0);
- //取得name元素的值
- String s = name1.getTextContent();
- System.out.println(s);
- }
- /**
- * 在第一个p1下面添加<sex>nv</sex>
- * @throws ParserConfigurationException
- * @throws IOException
- * @throws SAXException
- * @throws TransformerException
- */
- public static void addSex() throws ParserConfigurationException,TransformerException {
- /*
- * 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();
- //解析xml得到document
- Document document = builder.parse("src/person.xml");
- //得到所有的p1
- NodeList list = document.getElementsByTagName("p1");
- //得到第一个p1
- Node p1 = list.item(0);
- //创建标签
- Element sex = document.createElement("sex");
- //创建文本
- Text text = document.createTextNode("nv");
- //把文本添加到sex下
- sex.appendChild(text);
- //把sex添加到p1下
- p1.appendChild(sex);
- //回写xml
- TransformerFactory transformerFactory = TransformerFactory.newInstance();
- Transformer transformer = transformerFactory.newTransformer();
- transformer.transform(new DOMSource(document),new StreamResult("src/person.xml"));
- }
- /**
- * 修改第一个p1下面的sex内容是nan
- * @throws ParserConfigurationException
- * @throws IOException
- * @throws SAXException
- * @throws TransformerException
- */
- public static void modifySex() throws ParserConfigurationException,TransformerException {
- /*
- * 1.创建解析器工厂
- * 2.创建解析器
- * 3.解析xml得到document
- * 4.得到sex,使用item方法
- * 5.修改sex中的值,使用setTextContent方法
- * 6.回写xml
- */
- //创建解析器工厂
- DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
- //创建解析器
- DocumentBuilder builder = builderFactory.newDocumentBuilder();
- //解析xml得到document
- Document document = builder.parse("src/person.xml");
- //得到sex
- Node sex = document.getElementsByTagName("sex").item(0);
- //修改sex中的值
- sex.setTextContent("男");
- //回写xml
- TransformerFactory transformerFactory = TransformerFactory.newInstance();
- Transformer transformer = transformerFactory.newTransformer();
- transformer.transform(new DOMSource(document),new StreamResult("src/person.xml"));
- }
- /**
- * 删除<sex></sex>节点
- * @throws ParserConfigurationException
- * @throws IOException
- * @throws SAXException
- * @throws TransformerException
- */
- public static void deleteSex() throws ParserConfigurationException,TransformerException {
- /*
- * 1.创建解析器工厂
- * 2.根据解析器工厂创建解析器
- * 3.解析xml得到document
- * 4.获取sex元素
- * 5.获取sex的父节点
- * 6.删除使用父节点的removeChild方法
- * 7.回写xml
- */
- //创建解析器工厂
- DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
- //创建解析器
- DocumentBuilder builder = builderFactory.newDocumentBuilder();
- //解析xml得到document
- Document document = builder.parse("src/person.xml");
- //获取sex元素
- Node sex = document.getElementsByTagName("sex").item(0);
- //得到sex的父节点
- Node p1 = sex.getParentNode();
- //删除操作
- p1.removeChild(sex);
- //回写xml
- TransformerFactory transformerFactory = TransformerFactory.newInstance();
- Transformer transformer = transformerFactory.newTransformer();
- transformer.transform(new DOMSource(document),new StreamResult("src/person.xml"));
- }
- /**
- * 遍历节点,把所有元素名称打印出来
- * @throws ParserConfigurationException
- * @throws IOException
- * @throws SAXException
- */
- public static void listElements() throws ParserConfigurationException,IOException {
- /*
- * 1.创建解析器工厂
- * 2.根据解析器工厂创建解析器
- * 3.解析xml得到document
- * ======使用递归=======
- * 4.得到根节点
- * 5.得到根节点子节点
- * 6.得到根节点子节点的子节点
- */
- //创建解析器工厂
- DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
- //创建解析器
- DocumentBuilder builder = builderFactory.newDocumentBuilder();
- //解析xml得到document
- Document document = builder.parse("src/person.xml");
- //编写一个方法实现遍历操作
- list(document);
- }
- /**
- * 递归遍历的方法
- * @param document
- */
- public static void list(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);
- //继续得到node1的子节点
- list(node1);
- }
- }
- }