dom、dom 4j解析xml文件

Dom解析

Dom解析是将xml文件全部载入,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件。本文将先建立xml文件,然后通过dom解析器对xml文件进行解析,最后通过JUnit进行代码测试。

建立xml文件

建立xml约束文件(dtd)文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!ELEMENT 书架 (书+)>
    <!ELEMENT 书 (书名, 作者, 售价)>
    <!ELEMENT 书名 (#PCDATA)>
    <!ELEMENT 作者 (#PCDATA)>
    <!ELEMENT 售价 (#PCDATA)>

建立xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE 书架 SYSTEM "book.dtd">
    <书架>
        <书>
            <书名>Java就业培训教程</书名>
            <作者>张孝祥</作者>
            <售价>39.00</售价>
         </书>
          <书>
            <书名 name="Android经典图书">第一行代码</书名>
            <作者>郭霖</作者>
            <售价>59.00</售价>
         </书>
    </书架>

dom解析器解析xml文件

使用dom解析器对xml文件进行crud。

【读取】xml文档中的一个标签内容

    public class Demo2 {

        // 读取xml文档中 <书名>第一行代码</书名>的值
        @Test
        public void read() throws ParserConfigurationException, Exception {
            // 1、创建工厂
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            // 2、得到dom解析器
            DocumentBuilder builder = factory.newDocumentBuilder();
            // 3、解析xml文档,得到代表文档的document
            Document doc = builder.parse("XML/book.xml");

            NodeList list = doc.getElementsByTagName("书名");
            Node node = list.item(1);

            String content = node.getTextContent();
            System.out.println(content);
        }
    }

【读取】xml文件中的全部节点

    public class Demo2 {

        // 读取xml文件中的全部节点
        @Test
        public void read2() throws Exception {
            // 1、创建工厂
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            // 2、得到dom解析器
            DocumentBuilder builder = factory.newDocumentBuilder();
            // 3、解析xml文档,得到代表文档的document
            Document doc = builder.parse("XML/book.xml");

            // 得到根节点
            Node root = doc.getElementsByTagName("书架").item(0);
            list(root);
        }

        private void list(Node node) {
            if (node instanceof Element) {
                System.out.println(node.getNodeName());

            }
            NodeList lists = node.getChildNodes();
            for (int i = 0; i < lists.getLength(); i++) {
                Node chiled = lists.item(i);
                list(chiled);
            }
        }

    }

对xml文件的标签内容进行【增添】操作

    // 向xml文档中指定位置添加节点 <售价>100.00</售价>
        @Test
        public void add() throws Exception {
            // 1、创建工厂
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            // 2、得到dom解析器
            DocumentBuilder builder = factory.newDocumentBuilder();
            // 3、解析xml文档,得到代表文档的document
            Document doc = builder.parse("XML/book.xml");

            // 创建节点
            Element price = doc.createElement("售价");
            price.setTextContent("100.00");

            // 得到参考节点
            Element refNode = (Element) doc.getElementsByTagName("售价").item(1);
            // 得到要添加的节点
            Element book = (Element) doc.getElementsByTagName("书").item(1);
            // 往book节点的指定位置添加节点
            book.insertBefore(price, refNode);

            // 更新后的内存树添加到xml文档中
            TransformerFactory tfactory = TransformerFactory.newInstance();
            Transformer tf = tfactory.newTransformer();
            tf.transform(new DOMSource(doc), new StreamResult(new FileOutputStream(
                    "XML/book.xml")));
        }

对xml文件的标签内容进行【删除】操作

    @Test
        public void delete() throws Exception {
            // 1、创建工厂
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            // 2、得到dom解析器
            DocumentBuilder builder = factory.newDocumentBuilder();
            // 3、解析xml文档,得到代表文档的document
            Document doc = builder.parse("XML/book.xml");

            // 得到要删除的节点
            Element e = (Element) doc.getElementsByTagName("售价").item(1);
            e.getParentNode().removeChild(e);

            // 更新后的内存树添加到xml文档中
            TransformerFactory tfactory = TransformerFactory.newInstance();
            Transformer tf = tfactory.newTransformer();
            tf.transform(new DOMSource(doc), new StreamResult(new FileOutputStream(
                    "XML/book.xml")));
        }

对xml文件的标签内容进行【更新】操作

    @Test
        public void update() throws Exception {
            // 1、创建工厂
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            // 2、得到dom解析器
            DocumentBuilder builder = factory.newDocumentBuilder();
            // 3、解析xml文档,得到代表文档的document
            Document doc = builder.parse("XML/book.xml");

            Element element = (Element) doc.getElementsByTagName("售价").item(1);
            element.setTextContent("88");

            // 更新后的内存树添加到xml文档中
            TransformerFactory tfactory = TransformerFactory.newInstance();
            Transformer tf = tfactory.newTransformer();
            tf.transform(new DOMSource(doc), new StreamResult(new FileOutputStream(
                    "XML/book.xml")));
        }

Dom解析器和Sax解析器的区别

  • Dom解析器的优点是对文档的crud比较方便,缺点是占用内存比较大
  • Sax解析器优点是占用内存少,解析速度快,缺点是只适合做文档的读取,不适合做文档的crud。

Dom4j解析

Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早起开发JDOM的人分离出来而独立开发的。与Dom解析相比较,Dom4j使用接口和抽象类。虽然Dom4j的API相对要复杂些,但是它提供了比JDOM更好的灵活性。Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。

由于Dom4j不是sun公司的技术,因此在java中使用dom4j技术时,首先要加载dom4j相应的jar包。下面就以Dom4j的方式对XML文件进行crut。使用和Dom解析相同的XML文件。

dom4j解析器解析xml文件

以Dom4j的方式对XML文件进行crut

【读取】xml文档中的一个标签内容

    // 获得第二本书的书名
        @Test
        public void read() throws Exception {
            // 创建解析器,解析指定文档
            SAXReader reader = new SAXReader();
            Document document = reader.read(new File("XML/book.xml"));

            Element root = document.getRootElement();
            Element book = (Element) root.elements("书").get(1);
            String bookName = book.element("书名").getText();
            System.out.println(bookName);
        }

【读取】xml文档中的一个标签属性值

    // 获得第二本书的 属性值
        @Test
        public void read1() throws Exception {
            // 创建解析器,解析指定文档
            SAXReader reader = new SAXReader();
            Document document = reader.read(new File("XML/book.xml"));

            Element root = document.getRootElement();
            Element book = (Element) root.elements("书").get(1);
            String bookValue = book.element("书名").attributeValue("name");
            System.out.println(bookValue);
        }

对xml文件的标签内容进行【增添】操作

    // 为第二本书指定位置添加新的售价
        @Test
        public void add() throws Exception {
            // 创建解析器,解析指定文档
            SAXReader reader = new SAXReader();
            Document document = reader.read(new File("XML/book.xml"));

            // 创建新的售价节点
            Element price = DocumentHelper.createElement("售价");
            price.setText("100");
            Element book = (Element) document.getRootElement().elements("书").get(1);
            List list = book.elements();
            list.add(2, price);

            // 创建标准输出器
            OutputFormat format = OutputFormat.createPrettyPrint();
            format.setEncoding("UTF-8");

            // 更新内存
            XMLWriter writer = new XMLWriter(new OutputStreamWriter(
                    new FileOutputStream("XML/book.xml"), "UTF-8"), format);
            // XMLWriter writer = new XMLWriter(new FileWriter("XML/book.xml"));
            writer.write(document);
            writer.close();
        }

对xml文件的标签内容进行【删除】操作

    // 删除指定标签
        @Test
        public void delete() throws Exception {
            // 创建解析器,解析指定文档
            SAXReader reader = new SAXReader();
            Document document = reader.read(new File("XML/book.xml"));

            Element book = (Element) document.getRootElement().elements("书").get(1);
            Element price = (Element) book.elements("售价").get(0);
            price.getParent().remove(price);

            // 创建标准输出器
            OutputFormat format = OutputFormat.createPrettyPrint();
            format.setEncoding("UTF-8");

            // 更新内存
            XMLWriter writer = new XMLWriter(new OutputStreamWriter(
                    new FileOutputStream("XML/book.xml"), "UTF-8"), format);
            // XMLWriter writer = new XMLWriter(new FileWriter("XML/book.xml"));
            writer.write(document);
            writer.close();
        }

对xml文件的标签内容进行【更新】操作

    // 更新指定标签
        @Test
        public void update() throws Exception {
            // 创建解析器,解析指定文档
            SAXReader reader = new SAXReader();
            Document document = reader.read(new File("XML/book.xml"));

            //更新属性值
            /*Element book = (Element) document.getRootElement().elements("书").get(1);
            book.element("书名").setAttributeValue("name", "作者为CSDN博主");*/
            Element book = (Element) document.getRootElement().elements("书").get(1);
            book.element("书名").setText("疯狂Android讲义");

            // 创建标准输出器
            OutputFormat format = OutputFormat.createPrettyPrint();
            format.setEncoding("UTF-8");

            // 更新内存
            XMLWriter writer = new XMLWriter(new OutputStreamWriter(
                    new FileOutputStream("XML/book.xml"), "UTF-8"), format);
            // XMLWriter writer = new XMLWriter(new FileWriter("XML/book.xml"));
            writer.write(document);
            writer.close();
        }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值