利用JAXP的DOM方式对xml文档进行解析

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * JAXP的DOM方式解析XML
 * JAXP 是java提供处理xml文档的接口,用的类是W3c下面的类,JAXP包含DOM和SAX解析两种方式;

操作的是scr目录下的book.xml:
<?xml version ="1.0" encoding="UTF-8" standalone="no" ?><书架>
  <书 id= "b1" 出版日期= "2013-01-01" 出版社= "清华出版社" >
    <书名 >葵花宝典</ 书名> 
    <作者 >春哥</ 作者> 
    <售价 >39.3</ 售价> 
    <简介 >自宫!</ 简介> 
  <书 id= "b2" 出版社= "邮电出版社" >
    <书名 >九阴真经</ 书名> 
    <作者 >王重阳</ 作者> 
    <售价 >59.8</ 售价> 
    <简介 >白骨爪</ 简介>
  </书 >
</书架>

 *
 */
public class JAXPTest {
    @Test
    /**
     * 单元测试的方法:必须是public void   方法名 () 方法中不能有参数.需要导入JUnit 4包
     * 1.对xml进行查询。获得第一本书的作者节点 <作者>春哥</作者>
     */
    public void demo1() throws Exception {
        /**
        *JAXP DOM方式解析;
        * 1.创建解析器工厂 2.由解析器工厂 来 创建解析器 3.通过解析器解析XML文档. --- Document
        * 4.通过Document对象获得想去操作的节点.
        */
        // 创建解析器工厂.
       DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // 由工厂创建解析器
       DocumentBuilder builder = factory.newDocumentBuilder();
        // 解析XML。
       Document document = builder.parse("src/book.xml" );
        // 通过Document对象获得想去操作的节点.、
       NodeList nodeList = document.getElementsByTagName("作者" );
       Node node = nodeList.item(1);
       String value = node.getTextContent();
        System.out.println(value);
    }

    /**
     * 2.在第一本书的下面 添加一个作者节点 <作者> 曾哥</作者>
     *  * 1.创建解析器工厂
     *   2.由解析器工厂 来 创建解析器
     *   3.通过解析器解析XML文档. --- Document
     *   4.创建一个节点 <作者> 添加文本内容 曾哥. 5.找到第一本书的节点。 6.给书的节点
     * 添加一个子节点.
     *
     */
    @Test
    public void demo2() throws Exception {
       DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
       DocumentBuilder builder = factory.newDocumentBuilder();
       Document document = builder.parse("src/book.xml" );
        // 创建一个作者节点:
       Element author = document.createElement("作者" );
        // 设置内容
       author.setTextContent( "曾哥");
        // 找到第一本书
       Node node = document.getElementsByTagName("书" ).item(0);
        // 项第一本书下 添加一个节点.
       node.appendChild(author);
        // 回写XML --- 将内存中的树形结构 写回到 XML中  (了解)
       TransformerFactory tFactory = TransformerFactory.newInstance();
       Transformer transformer = tFactory.newTransformer();
       transformer.transform( new DOMSource(document), new StreamResult(
                "src/book.xml"));

    }
    
    /**
     * 3.在指定的位置添加节点。在 <作者>春哥</作者> 之前添加一个 <作者> 汪峰</作者>
     */
    @Test
    public void demo3() throws Exception {
       DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
       DocumentBuilder builder = factory.newDocumentBuilder();
       Document document = builder.parse("src/book.xml" );
       
        // 创建一个节点  给节点 添加一个文本内容
       Element author = document.createElement("作者" );
       author.setTextContent( "汪峰");
        // 先找到 春哥的 作者的节点。
       Node node = document.getElementsByTagName("作者" ).item(0);
        // 找到其父节点
        node.getParentNode().insertBefore(author, node);
       
       
       TransformerFactory tFactory = TransformerFactory.newInstance();
       Transformer transformer = tFactory.newTransformer();
       transformer.transform( new DOMSource(document), new StreamResult(
                "src/book.xml"));
       
    }
    
    /**
     * 4.修改文本内容.<作者>汪峰 </作者>  改成 <作者> 章子怡</作者>
     */
    @Test
    public void demo4()throws Exception{
       DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
       DocumentBuilder builder = factory.newDocumentBuilder();
       Document document = builder.parse("src/book.xml" );
       
        // 找到汪峰节点.
       Node node = document.getElementsByTagName("作者" ).item(0);
       node.setTextContent( "章子怡");
       
       TransformerFactory tFactory = TransformerFactory.newInstance();
       Transformer transformer = tFactory.newTransformer();
       transformer.transform( new DOMSource(document), new StreamResult(
                "src/book.xml"));
    }
    
    /**
     * 5.删除章子怡的作者节点.
     */
    @Test
    public void demo5()throws Exception{
       DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
       DocumentBuilder builder = factory.newDocumentBuilder();
       Document document = builder.parse("src/book.xml" );
       
        // 找到该节点,父节点删除之;
       Node node = document.getElementsByTagName("作者" ).item(0);
        node.getParentNode().removeChild(node);
       
       TransformerFactory tFactory = TransformerFactory.newInstance();
       Transformer transformer = tFactory.newTransformer();
       transformer.transform( new DOMSource(document), new StreamResult(
                "src/book.xml"));
    }
    
    /**
     * 扩展: 遍历所有的节点名称
     */
    @Test
    public void demo6()throws Exception{
       DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
       DocumentBuilder builder = factory.newDocumentBuilder();
       Document document = builder.parse("src/book.xml" );
        // 调用list的方法
       list(document);
    }

    private void list(Node node) {
        // 判断Node是否是Element类型的
        if(node.getNodeType() == Node.ELEMENT_NODE ){
            System.out.println(node.getNodeName());
       }
        // 获得所有的孩子节点
       NodeList nodeList = node.getChildNodes();
        for (int i = 0; i < nodeList.getLength(); i++) {
           Node n = nodeList.item(i);
            // 递归
           list(n);
       }
    }
    
    /**
     * 7.操作节点的属性.获得第一本书的出版社.
     */
    @Test
    public void demo7()throws Exception{
       DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
       DocumentBuilder builder = factory.newDocumentBuilder();
       Document document = builder.parse("src/book.xml" );
       
        // 找到了第一本书
       Node node = document.getElementsByTagName("书" ).item(0);
        // 如果父类没有这个方法  可以 转成 子类对象.
       Element element = null;
        if(node.getNodeType() == Node.ELEMENT_NODE ){
           element = (Element) node;
            System.out.println(element);
       }
         System.out.println(element.getAttribute( "出版社"));
    }
    
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值