Jaxp解析器_DOM解析方式

1、JAXP的DOM方式API文档(*****)
2、JAXP的DOM方式操作(查找和添加节点)(*****)
3、JAXP的DOM方式操作(遍历、修改和删除节点)(*****)
====================================================================
1、jaxp的api的查看
    ** jaxp是javase的一部分
    ** jaxp解析器在jdk的javax.xml.parsers包里面
    ** 四个类:分别是针对dom和sax解析使用的类 
            DocumentBuilderFactory、DocumentBuilder、SAXParserFactory、SAXParser
    *** dom:
        DocumentBuilderFactory: 解析器工厂
            - 这个类是一个抽象类,不能new,
            newInstance() 获取 DocumentBuilderFactory 的实例。
        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)下标取到具体的值
                for(int i=0;i<list.getLength();i++) {
                    list.item(i)
                }
            Node节点是Document、Element、文本对象、属性对象的父亲。
                getTextContent()
                - 得到标签里面的内容
    *** sax:
        SAXParserFactory: 解析器工厂
        SAXParser:解析器类

2、使用jaxp实现查询操作
    *** 查询xml中所有的name元素的值
    * 步骤
    //查询所有name元素的值
    1、创建解析器工厂
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
    2、根据解析器工厂创建解析器
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
    3、解析器解析xml返回 Document对象
       Document document = documentBuilder.parse("src/person.xml");
    4、得到所有的name元素
        NodeList nodeList = document.getElementsByTagName("name");
    5、返回集合,遍历集合,得到每一个name元素
        - 遍历 getLength()、item()
        - 得到元素里面值 使用 getTextContent()
        for(int i=0;i<list.getLength();i++) {
            Node node = list.item(i); //第i个节点,下标从0开始
            String str = node.getTextContent(); //节点里面的值
        }
3、使用jaxp添加节点
    *** 在第一个p1下面(末尾)添加 <sex>nv</sex>
    **步骤
        1、创建解析器工厂
            DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
        2、根据解析器工厂创建解析器
            DocumentBuilder builder = builderFactory.newDocumentBuilder();
        3、解析xml,返回document
            Document document = builder.parse("src/person.xml");
        4、得到第一个p1
            - 得到所有p1,使用item方法下标得到
            NodeList list = document.getElementsByTagName("p1");
            Node p1 = list.item(0);
        5、创建sex标签 createElement
            Element sex1 = document.createElement("sex");
        6、创建文本 createTextNode
            Text text1 = document.createTextNode("nv");
        7、把文本添加到sex下面 appendChild
            sex1.appendChild(text1);
        8、把sex添加到第一个p1下面
            p1.appendChild(sex1);
        9、回写xml ! 以上修改的都是修改的读到内存中的Document对象,必须回写到硬盘上才能更改!
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
4、使用jaxp修改节点
    /*
    * 1、创建解析器工厂
    * 2、根据解析器工厂创建解析器
    * 3、解析xml,返回document
    * 4、得到sex item方法
    * 5、修改sex里面的值  setTextContent方法
    * 6、回写xml
    * */
    //创建解析器工厂
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
    //创建解析器
        DocumentBuilder builder = builderFactory.newDocumentBuilder();
    //得到document
        Document document = builder.parse("src/person.xml");
    //得到sex
        Node sex1 = document.getElementsByTagName("sex").item(0);
    //修改sex值
        sex1.setTextContent("nan");
    //回写xml
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));

5、使用jaxp删除节点
    *** 删除<sex>nan</sex>节点
    ** 步骤
        /*
        * 1、创建解析器工厂
        * 2、根据解析器工厂创建解析器
        * 3、解析xml,返回document
        * 4、获取sex元素
        * 5、获取sex的父节点
        * 6、删除使用父节点删除 removeChild方法
        * 7、回写xml
        * */
        //创建解析器工厂
            DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
        //创建解析器
            DocumentBuilder builder = builderFactory.newDocumentBuilder();
        //得到document
            Document document = builder.parse("src/person.xml");
        //得到sex元素
            Node sex1 = document.getElementsByTagName("sex").item(0);
        //得到sex1父节点
            Node p1 = sex1.getParentNode();
        //删除操作
            p1.removeChild(sex1);
        //回写xml
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));

6、使用jaxp遍历节点
    ** 把xml中的所有元素名称打印出来
    ** 步骤
    /*
    * 1、创建解析器工厂
    * 2、根据解析器工厂创建解析器
    * 3、解析xml,返回document
    * ====使用递归实现=====
    * 4、得到根节点
    * 5、得到根节点子节点
    * 6、得到根节点子节点的子节点
    * */
    ** 遍历的方法:递归遍历的方法
    private 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);
            //继续得到node1的子节点
            //node1.getChildNodes()
            list1(node1);
        }
    }

猜你喜欢

转载自blog.csdn.net/weixin_42472048/article/details/81264771