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); } } }