JavaWeb笔记-05-jaxp解析及通过jaxp实现对节点的 增删改查及遍历

1、jaxp解析器api的查看

  jaxp解析器在jdk的javax.xml.parsers包里         四个类:分别针对dom和sax解析使用的类

  针对dom类:     
          DocumentBuilderFactory:解析器工厂  抽象类,不能new
                       需要用newInstance() 获取 DocumentBuilderFactory的实例
          DocumentBuileder: 解析器类   抽象类,不能new。  
                      需要从DocumentBuilederFactory.newDocumentBuilder();   方法中得到
          方法:
              parse(url)/parse(File f); 可以解析xml,返回Document文档  返回的是一个接口,父节点是Node

              NodeList.item(index)  取下标具体的值,可以通过此方法遍历节点集合

              .getTextContent();  得到元素里的值


  针对sax类:             SAXParsers: 解析器类            
                         SAXParsersFactory:  解析器工厂

2、使用jaxp实现查询操作

查询xml中所有name元素的值

  步骤: 
      1.创建解析器工厂   // DocumentBuilderFactory.newInstance();  

      2.根据解析器工厂创建解析器  //.newDocumentBuilder();

      3.解析xml返回document   //.parse("src/person.xml");

      4.得到所有的name元素   //.getElementsByTagName("name");

      5.遍历元素节点集合   //.getLength();

      6.得到每一个name元素节点   //.item(i);  

      7.得到元素里的值    //.getTextContent();
private static void selectAll() throws Exception {
        // 1.创建解析器工厂
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory
                .newInstance();
        // 2.根据解析器工厂创建解析器
        DocumentBuilder builder = builderFactory.newDocumentBuilder();
        // 3.解析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 s = name1.getTextContent();
            System.out.println(s);
        }
    }

3、使用jaxp添加节点

在第一个p1标签末尾后添加sex

 步骤: 
      1.创建解析器工厂   // DocumentBuilderFactory.newInstance();  

      2.根据解析器工厂创建解析器  //.newDocumentBuilder();

      3.解析xml返回document   //.parse("src/person.xml");

      4.得到第一个<p1>   //.getElementsByTagName("p1");
              // .item(0);
      5.创建sex元素    //.createElement()

      6.创建文本   //.createTextNode()

      7.将文本添加到<sex>中   .appendChild()
      8.将<sex>添加到<p>后  .appendChild() 

 *****此时只是添加到内存中,还未回写到xml文件中
 回写方法:  
          transform(new DOMsource(document), new StreamResult("xml文件路径"))

       9.创建回写工厂
                //TransformerFactory transformerFactory = TransformerFactory.newInstance();
      10. 通过回写工厂创建回写类
                  //Transformer transformer = transformerFactory.newTransformer();
       11.通过回写类调用回写方法
                    //  .transform(new DOMsource(document), new StreamResult("xml文件路径"))
private static void addSexEle() throws Exception {
        // 1.创建解析器工厂
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory
                .newInstance();
        // 2.根据解析器工厂创建解析器
        DocumentBuilder builder = builderFactory.newDocumentBuilder();
        // 3.解析xml返回document
        Document document = builder.parse("src/person.xml");
        // 得到p1
        NodeList list = document.getElementsByTagName("p1");
        Node p1 = list.item(0);

        // 创建sex元素 .createElement()
        Element sex1 = document.createElement("sex");
        // 创建文本 .createTextNode()
        Text text1 = document.createTextNode("man");
        // 将文本添加到sex中 .appendChild()
        sex1.appendChild(text1);
        // 将sex添加到<p>后 .appendChild()
        p1.appendChild(sex1);

        // 此时只是添加到内存中,还未回写到xml文件中
        // 回写方法 transform(new DOMsource(document), new StreamResult("xml文件路径"))
        //创建回写工厂
        TransformerFactory transformerFactory = TransformerFactory
                .newInstance();
        //通过回写工厂创建回写类
        Transformer transformer = transformerFactory.newTransformer();
        //通过回写类调用回写方法
        transformer.transform(new DOMSource(document), new StreamResult(
                "src/person.xml"));

    }

4、使用jaxp修改节点

修改第一个p1标签的sex的文本 为 women

  步骤:
      1.创建解析器工厂   // DocumentBuilderFactory.newInstance();  

      2.根据解析器工厂创建解析器  //.newDocumentBuilder();

      3.解析xml返回document   //.parse("src/person.xml");

      4.得到第一个 <sex> 节点            Node sex1 = document.getElementsByTagName("sex").item(0)

      5.修改属性值为"women"   //sex1.setTextContent("women");

      6.回写到xml
private static void modifySex() throws Exception {
        // 1.创建解析器工厂
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory
                .newInstance();
        // 2.根据解析器工厂创建解析器
        DocumentBuilder builder = builderFactory.newDocumentBuilder();
        // 3.解析xml返回document
        Document document = builder.parse("src/person.xml");

        // 得到sex
        Node sex1 = document.getElementsByTagName("sex").item(0);

        // 修改sex属性值
        sex1.setTextContent("women");

        // 回写
        TransformerFactory transformerFactory = TransformerFactory
                .newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.transform(new DOMSource(document), new StreamResult(
                "src/person.xml"));

    }

5、使用jaxp删除节点

删除第一个p1标签的sex元素

  步驟:
       1.创建解析器工厂   // DocumentBuilderFactory.newInstance();  

      2.根据解析器工厂创建解析器  //.newDocumentBuilder();

      3.解析xml返回document   //.parse("src/person.xml");

      4.得到sex             Node sex1 = document.getElementsByTagName("sex").item(0);

      5.获取sex父节点   //.getParentNode();

      6.使用父节点删除sex   // .removeChild(sex1);

      7.回写到xml
private static void delSex() throws Exception {
        // 1.创建解析器工厂
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory
                .newInstance();

        // 2.根据解析器工厂创建解析器
        DocumentBuilder builder = builderFactory.newDocumentBuilder();

        // 3.解析xml返回document
        Document document = builder.parse("src/person.xml");

        // 得到sex
        Node sex1 = document.getElementsByTagName("sex").item(0);

        // 获取sex父节点
        Node p = sex1.getParentNode();

        // 使用父节点删除sex
        p.removeChild(sex1);

        // 回写
        TransformerFactory transformerFactory = TransformerFactory
                .newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.transform(new DOMSource(document), new StreamResult(
                "src/person.xml"));
    }

6、使用jaxp遍历节点

打印出文档中所有元素名称

步骤:
    1.创建解析器工厂   // DocumentBuilderFactory.newInstance();  

    2.根据解析器工厂创建解析器  //.newDocumentBuilder();

    3.解析xml返回document   //.parse("src/person.xml");

    4.使用递归实现 节点遍历
    private static void list1(Node node) {
            //判断是否为元素 只打印元素 防止系统打印出 缩进(空格换行)
        if(node.getNodeType() == node.ELEMENT_NODE )   
            System.out.println(node.getNodeName());
        //得到第一层节点集合
        NodeList list = node.getChildNodes();

        //遍历第一层节点
        for(int i=0 ; i<list.getLength();i++){
            //得到第一层每一个节点
            Node node1 = list.item(i);

            //得到node1的子节点
            list1(node1);
        }
private static void listElement() throws Exception {
        // 1.创建解析器工厂
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory
                .newInstance();

        // 2.根据解析器工厂创建解析器
        DocumentBuilder builder = builderFactory.newDocumentBuilder();

        // 3.解析xml返回document
        Document document = builder.parse("src/person.xml");

        //=====使用递归实现 节点遍历
        //4.得到根节点   
        //5.得到根节点的子节点
        //6.得到根节点子节点的子节点....
        list1(document);

    }

    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的子节点
            list1(node1);
        }


    }

猜你喜欢

转载自blog.csdn.net/qq_41307491/article/details/81194173