查看原文
其他

XML文档与解析

树莓蛋黄派 Java规途 2023-07-04
  • XML简介

    • XML定义

    • XML的文档结构

    • XML的优势

    • XML文件的作用

  • XML语义约束

    • DTD约束

    • XML Schema约束

  • DOM解析XML

    • XML解析四种方式

    • 认识 DOM

    • 使用DOM来解析XML

  • 使用DOM4J解析XML

    • 认识DOM4J

    • 使用DOM4J解析XML

    • 使用DOM4J完成添加创建操作

    • 使用DOM4J完成对元素删除修改操作

  • 往期文章回顾

XML:可扩展标记语言

XML简介

XML定义

XML被称为「可扩展标记语言」,由SGML语言发展而来。允许用户自定义标签,将标签和内容有效分离。逐渐演变为一种跨平台的数据交换格式(不同平台、、不同系统之间),一种轻量级的持久化方案(无需数据库,保存简单数据)。

XML只是「纯文本」而已,是一种独立于软件和硬件的存储和传输工具。可以对外提供信息,但无法提供“动态行为”。

XML中开发者可以自定义标签,并且更加关注数据的存储和传输。XML不同于HTML可以在浏览器中解析和显示,它必须要通过自己编写的软件和程序才能够传送,接收和显示这个文档。

XML的文档结构

示例XML的文档结构

<?xml version="1.0" encoding="UTF-8"?>
<!-- XML description-->
<students>
    <student id="001">
        <name>JACK</name>
        <age>18</age>
        <score>98</score>
    </student>
    <student id="002">
        <name>Mike</name>
        <age>19</age>
        <score>99</score>
    </student>
</students>

一个标准的XML文档包含了以下内容:

  1. 文档声明

<?xml version="1.0" encoding="UTF-8"?>文档总是以XML声明开始,定义了XML的「版本信息」和所使用的「编码信息」等。

  1. 元素

开始标签、结束标签和内容组合成元素。元素是XML文档的主要部分,元素内容既可以是「普通文本」,也可以是「子元素」。一个XML文档有且仅有一个「根元素」,如上例的students元素

  1. 属性

<student id="001">中的id就是属性名,001是属性值。属性值要使用双引号括起来。「属性加载在一个元素的开始标签上」。一个元素可以有多个属性,可以用空格隔开,属性没有先后顺序。同一个XML元素不允许有同名的属性。

  1. 注释

<!-- XML description-->与HTML的注释一样。对XML文档的内容进行解释说明的文字。

  1. CDATA标记、字符实体

有时元素文本中会含有一些特殊的字符“&”,大于小于号等,这些字符在XML文档中已经用到了。此时主要通过两种办法来正确解析这些 字符。

  • 个别的特殊字符和用字符实体来进行替换

严格地说在XML文档中仅有字符“<”和“&”是非法的,单引号,双引号和大于号都是合法的。但是把他们替换成实体引用也是个好习惯。

  • 大量的特殊符号可以用CDATA标记来处理。

CDATA标记的所有字符都会被当作普通字符来处理,而不是XML标签,

定义CDATA的语法

<![CDATA[要显示的字符]]>

 <score><![CDATA[<90]]></score>

格式良好的XML文档:遵循XML文档的基本规则

  • 元素的正确嵌套
  • XML文件的第一行必须是xml文件的声明。
  • XML文件只能有一个根节点
  • 英文字符的大小写是有差异的。
  • 开始的控制标记与结束的控制标记是缺一不可的。
  • 属性值的设置必须用“”标记起来。

有效的XML文档

  • 首先必须是格式良好的(语法约束)
  • 使用DTD和XML Schema定义语义约束

XML的优势

  • 简单性:遵循XML文档的基本规则之的前提下,可以任意自定义标签
  • 良好的可读性:遵循XML文档的基本规则的前提下,标签名见名知义,具有良好的嵌套关系,带有了良好的可读性
  • 可扩展性:根据XML的基本语法来进一步限定使用范围和文档格式,从而定义一种新的语言。
  • 可以轻松地跨平台应用:XML文档是基于文本的,很容易被人和机器阅读,非常容易使用。便于不同设备和系统之间的信息交换
  • 数据内容与显示的分离:在XML文档中,数据的显示样式已经从文档中分离出来,而放入相关的样式表文件。

XML文件的作用

  • 数据交换

可以使用XML文件来交换数据,如可以通过XML文件来实现Windows和Linux的之间的数据传输。

  • 数据配置

使用XML配置文件可读性强,灵活性高,后面的JavaEE等开发会经常用到XML存储配置信息

  • 数据存储

XML文件可以做小型数据库,用来存储数据。如MSN中保存的聊天记录就是通过XML文件来存储。

XML语义约束

XML的语义约束主要包括DTD和XML schema两种约束。DTD是早期的约束,XML Schema是DTD的替代者,本身也是XML文件。功能更加强大。

DTD约束

DTD 文档类型定义,保证XML文档格式正确性,使用DTD定义了合法的语义约束后,必须让XML文档引入该语义的约束,才会生效。在XML文档中引入DTD 主要有三种方式:

内部DTD

指的是DTD与XML数据存于同一个XML文件中。「DTD定义在XML声明和XML主体之间」以结束。定义格式如图所示:

常见的DTD约束(基于student.xml文件)

注意:

  • 子元素有序使用逗号<!ELEMENT student (name,age,score+)>
  • 子元素互斥使用竖线<!ELEMENT student (name|age|score)>
  • 子元素无序没有特殊语法,变通解决:<!ELEMENT student ((name|age|score)+)>
  • 元素类型:#PCDATA表示字符串类型,EMPTY表示空内容,ANY表示任意内容。
  • 子元素出现的频率:
  1. ?表示子元素出现0到1次
  2. +表示子元素至少出现一次
  3. *表示子元素可以出现0到多次
  • PCDATA:被解析的「字符串类型」,在DTD定义中来指定元素类型 CDATA:「不被解析的字符串类型」。在DTD定义中指定属性类型。
  • ATTLIST:表示只能定义「一个属性」,如果一个元素中包含多个属性,则需要多个ATTLIST来定义。
  • 外部DTD

    如果存在不同的XML文件使用相同的DTD验证规则,此时可以采用外部DTD,让XML文件「引入外部DTD」

    <!ELEMENT students (student+)>
    <!ELEMENT student (name,age,score+)>
    <!ATTLIST student id CDATA #REQUIRED>
    <!ELEMENT name (#PCDATA)>
    <!ELEMENT age (#PCDATA)>
    <!ELEMENT score (#PCDATA)>

    引入外部DTD的语法是:「!DOCTYPE 根元素 SYSTEM “外部DTD文件路径"」

    完整的引用路径

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- XML description-->
    <!DOCTYPE students SYSTEM "student.dtd">
    <students>
        <student id="001">
            <name>JACK</name>
            <age>18</age>
            <score>98</score>
        </student>
        <student id="002">
            <name>Mike</name>
            <age>19</age>
            <score><![CDATA[<90]]></score>
        </student>
    </students>

    公用的DTD

    其实也是一种「外部的DTD」,主要是某个权威机构制定的并供给特定的行业或公众使用。公用的DTD使用PUBLIC关键字引入,并且还要增加一个 标识名。引入语法:「!DOCTYPE 根元素 PUBLIC “DTD标识名" “公用的DTD的URL"」

    缺点

    可以定义XML文档的结构,但是「无法约束XML内元素的内容。」

    XML Schema约束

    XML Schema使用XML文档来定义语义约束,相比DTD更加复杂,但是功能也更加强大。

    它指定丰富的类型,允许开发者自定义数据类型,既可以定义XML文档的结构,还可以对XML文档的内容进行约束。其优势主要体现在:

    1. 可读性强:本身就是一个XML文档
    2. 支持数据类型:比如日期类型,并且可以限定日期范围。
    3. 可扩展:可以导入其他的Schema,自定义数据类型,一个XML文档可以使用多个XML Schema

    开源框架中大量使用了XML文档。陆续从以前的DTD约束升级到Schema约束。

    XMLSchema约束的三种编写方式

    1. Russia Roll(俄罗斯玩偶)
    <?xmlversion="1.0" encoding="UTF-8"?>

    <schemaxmlns="http://www.w3.org/2001/XMLSchema"targetNamespace="http://www.example.org/02"

    xmlns:tns="http://www.example.org/02"elementFormDefault="qualified">


     

    <element name="books">

               <complexType>

               <!-- maxOccurs表示最大出现次数-->

                        <sequencemaxOccurs="unbounded">

                                 <elementname="book">

                                           <complexType>

                                                    <sequenceminOccurs="1" maxOccurs="unbounded">

                                                             <elementname="title" type="string" />

                                                             <elementname="content" type="string" />

                                                             <choice>

                                                                       <elementname="author" type="string" />

                                                                       <elementname="authors">

                                                                                <complexType>

                                                                                         <all><!--每个元素只能出现一次 -->

                                                                                                   <elementname="author" type="string"/>

                                                                                         </all>

                                                                                </complexType>

                                                                       </element>

                                                             </choice>

                                                    </sequence>

                                                    <attributename="id" type="int" use="required"/>

                                           </complexType>

                                 </element>

                        </sequence>

               </complexType>

    </element>

     

    </schema>

    「优点是结构清晰,缺点是类型不能重用」

    1. Salami Slice(腊肉切片)
    <?xml version="1.0"encoding="UTF-8"?>

    <schemaxmlns="http://www.w3.org/2001/XMLSchema"

                       targetNamespace="http://www.example.org/03"

                       xmlns:tns="http://www.example.org/03"

                       elementFormDefault="qualified">


     

             <elementname="book" type="tns:bookType"></element>

             <elementname="id" type="int"/>

             <elementname="title" type="string"/>

             <elementname="content" type="string"/>

            

            

             <complexTypename="bookType">

                       <sequence>

                                <elementref="tns:id"/>

                                <elementref="tns:title"/>

                                <elementref="tns:content"/>

                       </sequence>

             </complexType>

    </schema>

    「优点是类型最大程度重用,缺点是结构不够清晰,根节点不太好找哦」

    1. Venetian Blind(百叶窗)
    <?xml version="1.0"encoding="UTF-8"?>

    <schemaxmlns="http://www.w3.org/2001/XMLSchema"

                       targetNamespace="http://www.example.org/04"

                       xmlns:tns="http://www.example.org/04"

                       elementFormDefault="qualified">


                      

             <elementname="person" type="tns:personType"/>

            

             <complexTypename="personType">

                       <sequence>

                                <elementname="name" type="string"/>

                                <elementname="age" type="tns:ageType"/>

                                <elementname="email" type="tns:emailType"/>

                       </sequence>

                       <attributename="sex" type="tns:sexType"/>

             </complexType>

            

             <simpleTypename="emailType">

                       <restrictionbase="string">

                                <patternvalue="(\w+\.*)*\w+@\w+\.[A-Za-z]{2,6}"/>

                                <minLengthvalue="6"/>

                                <maxLengthvalue="255"/>

                       </restriction>

             </simpleType>

            

             <simpleTypename="ageType">

                       <restrictionbase="int">

                                <minInclusivevalue="1"/>

                                <maxExclusivevalue="150"/>

                       </restriction>

             </simpleType>

            

             <simpleTypename="sexType">

                       <restrictionbase="string">

                                <enumerationvalue="男"/>

                                <enumerationvalue="女"/>

                       </restriction>

             </simpleType>

    </schema>

    DOM解析XML

    XML解析四种方式

    DOM和SAX是两种解析规范,目前主流的XML解析器都会为DOM和SAX提供实现。但这两种原生的解析方式代码冗长,可读性并不高。因此Java领域又出现两个新的解析器:DOM4J和JDOM,两者很有渊源,也非常相似。DOM4J是面向接口编程的,JDOM是面向实现编程的。目前DOM4J的性能比JDOM要好,也更加灵活。

    DOM(Document Object Model)文档对象模型

    使用该技术解析文档时,会根据要操作的文档,构建「一棵要驻留在内存中的树」。然后使用DOM接口来操作这棵树。由于树驻留在内存中的,所以 操作非常方便。但因为这棵树中包含了所有的XML的内容,所以比较耗资源。该方式适合处理小文档。,适合多次访问的文档解析。

    SAX (Simple API for XML)

    其是基于「事件」解析的,为了解决DOM耗费资源而产生的。SAX在解析文档时会依次出发文档开始,元素开始,元素结束,文档结束等事件。应用程序通过监听解析过程中触发的事件来获得XML的内容。不需要事先将整个文档调入。占用资源少,消耗小,一般解析大的XML文档时会使用该方法。

    DOM4J(DOM for Java)

    开源的XML解析工具,完全支持DOM和SAX机制,具有性能优异,功能强大,操作简单等特点。越来越多的Java软件开始支持使用DOM4J来处理XML文档。

    JDOM (Java DOM)

    JDOM的目的是为了成为Java的特定文档模型。其与DOM4J具有相同的设计目的,用法也十分类似,JDOM主要以类的API为主,DOM4J主要以接口的 API为主。

    总结:Java对DOM和SAX两种规范都提供了支持。Java解析XML文档的叫做JAXP,作为JDK的一部分发布。其中javax.xml.parsers包中提供了四个与DOM和SAX解析相关的类,

    • 「如果使用DOM解析,就是用org.w3c.dom包的类和接口。」
    • 「如果使用SAX解析,就是用org.xml.sax包的类和接口。」

    认识 DOM

    DOM将文档解析为一棵树,XML文档的节点对应DOM树的节点,节点之间保持父子、兄弟关系。并且DOM树中 每一个节点都是一个对象。若要解析文档,则需要利用面向对象的思想调用节点的「属性」「方法」。可以对该树进行添加修改删除查询操作。最终会转换为对应 XML文档的操作。

    Node类是DOM树中节点的「父类」。根据具体类型可以划分成多个子类:

    • 元素节点类 Element
    • 属性节点类 Attr
    • 文本节点类 Text .........

    另外还有「注释类Comment,文档类Document」。其中「Document」表示整个XML文档本身,是对整个文档进行操作的入口。Document对象中包含一个「根节点」

    使用DOM来解析XML

    使用DOM可以解析XML,同时也可以对XML的内容进行增删改查。

    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    import org.xml.sax.SAXException;

    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import java.io.File;
    import java.io.IOException;

    /**
     * @author lambda
     */

    public class TestDom {
        public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException {
            //创建DOM解析器工厂
           DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
            //由DOM解析器工厂创建DOM解析器
            DocumentBuilder db= dbf.newDocumentBuilder();
            //由DOM解析器解析文档,生成DOM树  /data/home/lambda/idea软件/src/xn/XMLExercises
            Document document=db.parse(new File("/data/home/lambda/idea软件/src/xn/XMLExercises/Student2.xml"));
           // System.out.println(document);

            //解析DOM树,此时的nodeList里面包含注释,约束规范和之后的元素(文档的具体内容)

            /* 第一种方式,利用孩子节点来查找元素
            NodeList nodeList=document.getChildNodes();
            System.out.println(nodeList.getLength());
            //获取具体的内容(依据索引值)
            Element root=(Element)nodeList.item(2);
            System.out.println(root);

    */

            //第二种方式,直接利用标签来获取元素。
            //直接按照标签名字来找,会返回一个节点集合,因为要查找的元素可能不止一个。

            //解析步骤
            /*
            * 1.获取根元素
            * 2.获取根元素students的子元素student
            * 3对每个student进行操作
            * */


            //获取根元素
            NodeList nodeList= document.getElementsByTagName("students");
            //此时在students这个集合内查找下标为0的元素。即根元素
            Element root= (Element) nodeList.item(0);
            System.out.println(root);

            //获取根元素下的子元素student,其中空白部分也算做Text节点,所以节点个数为5(获取孩子节点空白也会计入。需要排除。)
            NodeList stuNodeList = root.getChildNodes();
            //System.out.println(stuNodeList.getLength());
            for (int i=0;i<stuNodeList.getLength();i++){
                Node node=stuNodeList.item(i);
               // System.out.println(node.getNodeType());
                //Node.ELEMENT_NODE=1表示为元素
                if (node.getNodeType()==Node.ELEMENT_NODE){
                    //获取每个student的id属性(先将Node类型的节点转换成Element类型)
                    Element stuElement=(Element) node;
                 String idValue=stuElement.getAttribute("id");
                    System.out.println("id----->"+idValue);

                    //获取student的孩子元素节点
                   NodeList NodeList1 = stuElement.getChildNodes();
                   // System.out.println(NodeList1.getLength());
                for (int j=0;j<NodeList1.getLength();j++){
                        Node node1=NodeList1.item(j);
                        if (node1.getNodeType()==Node.ELEMENT_NODE){
                            Element nasElement=(Element) node1;
                            //获取标签内的文本内容 nasElement.getTextContent();
                           // System.out.println(nasElement.getTagName()+"   "+nasElement.getNodeName()+"   "+nasElement.getNodeValue());

                            System.out.println(nasElement.getTagName()+"-------->"+nasElement.getTextContent());
                        }
                     }
                }
            }
        }
    }

    使用DOM4J解析XML

    认识DOM4J

    DOM4J是一套开源的XML解析工具,与利用DOM SAX和JAXP相比,表现更优秀,更容易并且性能优越。虽然DOM4J也将文档解析为一棵结构化的树,但是它的处理方式比DOM简单很多。

    使用DOM4J解析XML

    import org.dom4j.Attribute;
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    import org.w3c.dom.Attr;

    import java.io.File;
    import java.util.Iterator;
    import java.util.List;

    /**
     * @author lambda
     */

    public class TestDom4J1 {

        public static void main(String[] args) throws DocumentException {
            //根据XML文档创建一个DOM4J的树。
            /*reader是一个解析器*/
            SAXReader reader=new SAXReader();
            /*file是一个文件*/
            File file=new File("/data/home/lambda/idea软件/src/xn/XMLExercises/Student2.xml");
            /*我们需要利用reader解析器解析file文件,形成一棵树。*/
            Document doc= reader.read(file);
            //获取DOM4J树的根节点,students
            Element rootElement = doc.getRootElement();
            //获取students的子节点student
            /*此时获取根节点下指定名字的子节点student(此时只有student)*/
               List<Element> stuList= rootElement.elements("student");
               /*利用迭代器遍历stuList*/
            Iterator<Element> iterator=stuList.iterator();
          /*  rootElement.elementIterator("student");上一操作的简便写法*/

            //对student的属性和子节点进行解析。
            while (iterator.hasNext()){
                //获取每个学生student
                Element stuElement=iterator.next();
                //获取学生的属性

                /**
               Attribute attr=stuElement.attribute("id");
                System.out.println(attr.getName()+"----->"+attr.getValue());
                 得到单个属性
                 */


              Iterator<Attribute> attributeIterator=  stuElement.attributeIterator();
              while (attributeIterator.hasNext()){
                  Attribute attribute=attributeIterator.next();
                  System.out.println(attribute.getName()+":"+attribute.getValue());
              }
                //获取student的子元素(name age  score等)
                List<Element> nasElement = stuElement.elements();
                for (Element element : nasElement) {
                    //方法一
                   System.out.println(element.getName()+"----->"+element.getStringValue());
                   //方法二
                    System.out.println(element.getName()+"----->"+element.getText());
                }
                System.out.println(" ");
            }



        }
    }
    • 技能点1:DOM4J对底层原始的XML文档解析进行「高度的封装」。这种封装简化了XML的处理,在DOM4J的包下提供了如下几个类:
    1. 「DOMReader」:根据w3c的DOM树创建DOM4J树

    2. 「SAXReader」:基于SAX解析机制解析一份XML文档,并将其转换为一棵DOM4J树。

    • 技能点2:获取属性

    1.获取所有属性:List attributes=elem.attributes();

    2.获取指定的属性:Attribute attr=elem.attribute("id");

    3.attr.getName()+":"+attr.getValue()获取属性名和属性值

    • 技能点3:获取元素
    1. Element rootElem=doc.getRootElement()获取根元素

    2. List stuList=rootElement.elements()获取所有名称的子元素列表

    3.List stuList=rootElement.elements("student")获取指定名称的子元素列表

    4.String ename=subElem.getName()获取元素名称

    5.String etxt=subElem.getText();获取元素文本

    使用DOM4J完成添加创建操作

    创建一个新的XML文档开始

    /**
     *
     * 创建一个新的XML文档*/


    import org.dom4j.Document;
    import org.dom4j.DocumentFactory;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;
    import org.dom4j.io.OutputFormat;
    import org.dom4j.io.XMLWriter;

    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Writer;

    /**
     * @author lambda
     */

    public class TestDom4J2 {
        public static void main(String[] args) throws IOException {
                //1.创建一个DocumentFactory工厂对象
            DocumentFactory factory=new DocumentFactory();

                //2.使用一个DocumentFactory对象创建一个Document对象
            Document doc=factory.createDocument();
                //使用帮助者工具类来创建Document
            Document doc1= DocumentHelper.createDocument();
                //添加一部分注释
            doc.addComment("用DOM4J创建一个XML文档并添加注释");
            //3、给Document增加一个根节点students
               Element rootElement= doc.addElement("Students");
            //4.给students添加一个子节点student
              Element stuElement=  rootElement.addElement("student");
            //5.给student节点添加一个属性节点id
                stuElement.addAttribute("id","001");
            //6给student节点添加子节点,name age score
               Element nameElement= stuElement.addElement("name");
               nameElement.setText("王五");
               Element ageElement=stuElement.addElement("age");
               ageElement.setText("25");
               Element scoreElement=stuElement.addElement("score");
               scoreElement.setText("95");
            //将DOM4J树写入一个文件。
            /*创建一个好看的输出样式,创建一个好看的样式*/
            OutputFormat format=OutputFormat.createPrettyPrint();
            Writer writer=new FileWriter("/data/home/lambda/idea软件/src/xn/XMLExercises/Student3.xml");
            //writer提供一个路径给xmlWriter
            XMLWriter xmlWriter=new XMLWriter(writer,format);
            //xmlwriter调用write将doc的内容写入writer提供的路径的文件当中,
            xmlWriter.write(doc);
            xmlWriter.close();
        }
    }
    • 技能点1:如何创建「新的XML文档」
    1. DocumentFactory:使用了「工厂模式」

    2. DocumentHelper:底层还是调用了DocumentFactory

  • 技能点2:如何「添加子元素」
    1. Element stuElement=rootElement.addElement("student");

    2. stuElement.addAttribute("id","003");//di属性

    3. Element stuAgeElement=stuElement.addElement("age")age子元素

    4. stuAgeElement.setText("30")

  • 技能点3:如何「写数据到XML文件中」
    1. XMLWriter xmlWriter=new XMLWriter(new FileWriter(”filePath“),OutputFormat.createPrettyPrint())

    2. createPrettyPrint:精致美观格式,带缩进,有换行,格式美观

    3. createCompactFormat:紧密压缩格式,没有缩进,没有换行。

    添加元素到已存在的文件(默认最后一个元素)

    /*
    * *
    * 在已经存在的文件中加入元素子节点,即加到最后面*/


    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.io.OutputFormat;
    import org.dom4j.io.SAXReader;
    import org.dom4j.io.XMLWriter;

    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Writer;

    /**
     * @author lambda
     */

    public class TestDOM4J3 {
        public static void main(String[] args) throws DocumentException, IOException {
            //1.根据XML文档创建DOM树
            SAXReader reader=new SAXReader();
            File file=new File("/data/home/lambda/idea软件/src/xn/XMLExercises/Student3.xml");
            Document doc=reader.read(file);

            //2.获取根节点
            Element rootElement=doc.getRootElement();

            //3.给students添加一个子节点student(加到最后)
            Element stuElement =rootElement.addElement("student");
                    //给添加的子元素student添加属性
            stuElement.addAttribute("id","002");
            //4.给student添加子元素
            Element nameElement=stuElement.addElement("name");
            nameElement.addText("张三");
            Element ageElement=stuElement.addElement("age");
            ageElement.addText("26");
            Element scoreElement=stuElement.addElement("score");
            scoreElement.addText("94");

            //5.将新建的内存树模型写入硬盘中。
            OutputFormat format=OutputFormat.createPrettyPrint();
            //设置新加的编码:
            format.setEncoding("UTF-8");
            Writer writer=new FileWriter(file);
            XMLWriter xmlWriter=new XMLWriter(writer,format);
            xmlWriter.write(doc);
            xmlWriter.close();
        }
    }

    添加元素至已存在的文件(指定位置,利用集合的方式)

    /** * 添加一个子节点到指定的位置。 
      * */

    import org.dom4j.Document;import org.dom4j.DocumentException;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;
    import org.dom4j.io.OutputFormat;
    import org.dom4j.io.SAXReader;
    import org.dom4j.io.XMLWriter;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Writer;
    import java.util.List;
    /** 
    * @author lambda
    */

    public class TestDOM4J4 {  
      public static void main(String[] args) throws DocumentException, IOException {   
      //1.解析文件为DOM树  
      SAXReader reader=new SAXReader(); 
      File file=new File("/data/home/lambda/idea软件/src/xn/XMLExercises/Student3.xml");  
      Document doc=reader.read(file); 
      //2.获取根节点  
      Element rootElement=doc.getRootElement();  
      //3遍历根节点下所有的student子节点 
      List<Element> stuList=rootElement.elements(); 
      //4.新建一个student子节点。(不用根节点,因为这里只是创建一个新的节点。)           Element stuElement= DocumentHelper.createElement("student");  
      //为student新建结点添加属性值   
      stuElement.addAttribute("id","003");  
      Element nameElement =stuElement.addElement("name");  
      nameElement.addText("李白");  
      Element ageElement=stuElement.addElement("age");  
      ageElement.addText("999");  
      Element scoreElement=stuElement.addElement("score"); 
      scoreElement.addText("9999"); 
      //5.将新建立的节点添加到指定的位置(采用集合的方式来添加) 
      stuList.add(1,stuElement);   
      //6将添加好的内存树写入xml文件中  
      OutputFormat format=OutputFormat.createPrettyPrint(); 
      format.setEncoding("utf_8"); 
      Writer writer=new FileWriter("/data/home/lambda/idea软件/src/xn/XMLExercises/Student3.xml");  
      XMLWriter xmlWriter=new XMLWriter(writer,format);  
      xmlWriter.write(doc);  
      xmlWriter.close(); 
      }
    }

    技能点:「添加元素到指定的位置」

    1. List lists=rootElement.elements("student");
    2. Element stuElement=DocumentHelper.createElement("student");
    3. lists.add(1,stuElement);

    使用DOM4J完成对元素删除修改操作

    使用DOM4J删除指定元素

    /**
    删除指定XML文档的指定节点 
    *
    */

    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.io.OutputFormat;
    import org.dom4j.io.SAXReader;
    import org.dom4j.io.XMLWriter;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Writer;
    import java.util.List;
    /** 
    * @author lambda 
    */

    public class TestDOM4J5 {   
      public static void main(String[] args) throws DocumentException, IOException{    
      //1.首先根据XML文档创建DOM树 
      SAXReader reader=new SAXReader();   
      File file=new File("/data/home/lambda/idea软件/src/xn/XMLExercises/Student3.xml"); 
      Document doc=reader.read(file);
      //2.获取根节点  
      Element rootElement=doc.getRootElement();  
      //3.获取根节点下所有子节点 
      List<Element> stuList = rootElement.elements(); 
      //4.删除指定的节点(若知道索引,remove方法即可)  
      //stuList.remove(1);  
      //若不知道索引,只知道id ,需要对整个集合进行遍历   
      for (int i = 0; i < stuList.size(); i++) {    
          Element stuElement=stuList.get(i);    
          //获得指定删除节点的id值     
          String value=stuElement.attribute("id").getValue(); 
                 if ("003".equals(value)){    
                      stuList.remove(stuElement);  
                  //通过父亲节点来删指定元素   
                  //rootElement.remove(stuElement);  
                }   
            }    
     //5.将DOM树写入xml中 
      OutputFormat format=OutputFormat.createPrettyPrint();  
     // format.setEncoding("utf-8");
    //写入到指定的文件中  
    Writer writer=new FileWriter("/data/home/lambda/idea软件/src/xn/XMLExercises/Student3.xml"); 
    XMLWriter xmlWriter=new XMLWriter(writer,format);  
    xmlWriter.write(doc);  
    xmlWriter.close();
        }
    }

    使用DOM4J完成「修改指定元素」

    /*
    *修改id为003的节点 
    *
    */

    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.io.OutputFormat;
    import org.dom4j.io.SAXReader;
    import org.dom4j.io.XMLWriter;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Writer;
    import java.util.List;
    /**
    * @author lambda 
    */

    public class TestDOM4J6 {   
          public static void main(String[] args) throws DocumentException, IOException 
          //1.首先根据XML文档创建DOM树 
          SAXReader reader=new SAXReader();
          File file=new File("/data/home/lambda/idea软件/src/xn/XMLExercises/Student3.xml"); 
          Document doc=reader.read(file); 
          //2.获取根节点      
          Element rootElement=doc.getRootElement(); 
          //3.获取根节点下所有子节点      
          List<Element> stuList = rootElement.elements();  
          for (int i = 0; i < stuList.size(); i++) { 
                Element stuElement=stuList.get(i);  
                //获得指定节点的id值  
                String value=stuElement.attribute("id").getValue();                     //获得stuElement的下一个元素       
                Element nameElement= stuElement.element("name");                        if ("003".equals(value)){    
                        //修改stuElement的name    
                      nameElement.setText("小明");  
                    stuElement.attribute("id").setText("101");   
                            break;          
                      }      
              }   
         //5.将DOM树写入xml中   
           OutputFormat format=OutputFormat.createPrettyPrint();    
          // format.setEncoding("utf-8");  
          //写入到指定的文件中  
          Writer writer=new FileWriter("/data/home/lambda/idea软件/src/xn/XMLExercises/Student3.xml");  
          XMLWriter xmlWriter=new XMLWriter(writer,format); 
        xmlWriter.write(doc);  
        xmlWriter.close(); 
              }
    }

    往期文章回顾

    你不可不知的语言---JAVA

    Java基本程序设计结构——数据类型

    变量+运算=?

    字符串详解

    输入输出与流程

    数组与大数

    类初识

    自定义类与时间类

    方法参数与对象构造

    包、注释及JAR文件

    继承及其子类

    Object类及其方法

    泛型数组列表及包装类

    IO流概述

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存