Java的xml解析器

1、jaxp

是javase的一部分,就是jdk中的一部分,javax.xml.parsers包

1.1、dom方式解析xml
    DocumentBuilder
    DocumentBuilderFactory

package demo;

import org.w3c.dom.*;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.IOException;

public class AppDom {
    public static void main(String[] args) throws Exception {
        queryList();
        //insertTag();
        //updateTag();
        //deleteTag();
    }


    public static void queryList() throws ParserConfigurationException, IOException, SAXException {
        //1、创建解析器工厂
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();

        //2、创建解析器
        DocumentBuilder builder = builderFactory.newDocumentBuilder();

        //3、解析xml返回document
        Document doc = builder.parse("./src/main/resources/persons.xml");

        //4、递归遍历
        RecursiveNode(doc);
    }

    private static void RecursiveNode(Node node) {
        //判断是元素类型才打印
        if (node.getNodeType()==Node.ELEMENT_NODE){
            System.out.println(node.getNodeName());
        }

        //得到当前节点的子节点集合
        NodeList nodeList = node.getChildNodes();

        //遍历
        for (int i= 0;i<nodeList.getLength();i++){
            RecursiveNode(nodeList.item(i));
        }
    }

    public static void insertTag() throws Exception{
        //1、创建解析器工厂
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
        //2、创建解析器
        DocumentBuilder builder = builderFactory.newDocumentBuilder();
        //3、解析xml,返回document
        Document doc = builder.parse("./src/main/resources/persons.xml");
        //4、得到第一个person标签
        Node person = doc.getElementsByTagName("person").item(0);
        //5、创建sex标签 createElement
        Element sex = doc.createElement("sex");
        //6、创建文本 createTextNode
        Text text = doc.createTextNode("男");
        //7、把文本添加到sex标签下面 appendChild
        sex.appendChild(text);
        //8、把sex标签添加到第一个person下面
        person.appendChild(sex);
        //9、回写
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.transform(new DOMSource(doc),new StreamResult("./src/main/resources/persons.xml"));
    }

    private static void updateTag() throws Exception {
        //1、创建解析器工厂
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
        //2、创建解析器
        DocumentBuilder builder = builderFactory.newDocumentBuilder();
        //3、解析xml,返回document
        Document doc = builder.parse("./src/main/resources/persons.xml");
        //4、得到第一个sex标签
        Node sex = doc.getElementsByTagName("sex").item(0);
        //5、修改sex标签 setTextContext()
        sex.setTextContent("女");
        //6、回写
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.transform(new DOMSource(doc),new StreamResult("./src/main/resources/persons.xml"));
    }

    public static void deleteTag() throws Exception {
        //1、创建解析器工厂
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
        //2、创建解析器
        DocumentBuilder builder = builderFactory.newDocumentBuilder();
        //3、解析xml,返回document
        Document doc = builder.parse("./src/main/resources/persons.xml");
        //4、得到第一个sex标签
        Node sex = doc.getElementsByTagName("sex").item(0);
        //5、获取sex的父节点
        Node person = sex.getParentNode();
        //6、使用父节点删除 removeChild()
        person.removeChild(sex);
        //7、回写
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.transform(new DOMSource(doc),new StreamResult("./src/main/resources/persons.xml"));
    }
}

 1.2、sax方式解析xml

    SAXParser
    SAXParserFactory

package demo;

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

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class AppSax {
    public static void main(String[] args) throws Exception {
        /*
         *  1、创建解析器工厂
         *  2、创建解析器
         *  3、执行parse()
         *  4、继承DefaultHandler,重写三个方法
         *  5、
         */
        //1、创建解析器工厂
        SAXParserFactory factory = SAXParserFactory.newInstance();
        //2、创建解析器
        SAXParser parser =factory.newSAXParser();
        //3、执行parse()
        parser.parse("./src/main/resources/book.xml",new PrintNameHandler());
    }
}

/**
 * 打印出所有name标签的值
 */
class PrintNameHandler extends DefaultHandler{
    boolean flag = false;
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if ("name".equals(qName)){
            flag = true;
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (flag==true){
            System.out.println(new String(ch,start,length));
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if ("name".equals(qName)){
            flag = false;
        }
    }
}

/**
 * 打印xml处理器
 */
class PrintXMLHandler 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+">");
    }
}

2、dom4j

2.1、sax方式

原文地址:https://www.cnblogs.com/hsiaochinchin/p/14013342.html