XML DOM 基础

2022/4/15 23:13:04

本文主要是介绍XML DOM 基础,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

XML DOM

意义

  • 解决程序间数据传输问题(现在被json替代)
  • 作为配置文件(目前还大量应用)
  • 充当小型数据库

语法

声明

<?xml version="1.0" encoding="utf-8"?>

1、XML 声明放在 XML 文档的第一行

2、XML 声明由以下几个部分组成:

3、version - -文档符合 XML1.0 规范,我们学习 1.0

4、encoding - -文档字符编码,比如"utf-8"

元素

  • 每个XML文档必须有且只有一个根元素。

  • 根元素是一个完全包括文档中其他所有元素的元素。

  • 根元素的起始标记要放在所有其他元素的起始标记之前。

  • 根元素的结束标记要放在所有其他元素的结束标记之后。

  • 应用实例:

    <?xml version="1.0" encoding="utf-8" ?> 
    <!-- 
    老韩解读 
    1.每个 XML 文档必须有且只有一个根元素。 
    2.根元素是一个完全包括文档中其他所有元素的元素。 
    3.根元素的起始标记要放在所有其他元素的起始标记之前。 
    4.根元素的结束标记要放在所有其他元素的结束标记之后 
    5.XML 元素指 XML 文件中出现的标签,一个标签分为开始标签和结束标签,一 个标签有如下几种书写形式 包含标签体:<a>www.sohu.cn</a> 不含标签体的:<a></a>, 简写为:<a/> 
    6.一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不允许 交叉嵌套
    7. 叫法 student 元素,节点,标签 
    -->
    <students> 
        <student id="100"> 
            <name>jack</name> 
            <age>10</age> 
            <gender>男</gender> 
        </student> 
        <student id="200"> 
            <name>mary</name> 
            <age>18</age> 
            <gender>女</gender> 
        </student> 
        <school>清华大学</school> 
        <city/> 
    </students>
    

    XML 元素命名规则

    • 区分大小写,例如,

      是两个不同的标记。

    • 不能以数字开头。

    • 不能包含空格。

    • 名称中间不能包含冒号(:)。

    • 如果标签单词需要间隔,建议使用下划线 比如 <book_title>hello</book_title>

属性

  • 属性值用双引号(")或单引号(')分隔(如果属性值中有',用"分隔;有",用'分隔)

  • 一个元素可以有多个属性,它的基本格式为:<元素名 属性名="属性值">

  • 特定的属性名称在同一个元素标记中只能出现一次

  • 属性值不能包括& 字符

<Student ID="100"> 
    <Name>TOM</Name> 
</Student>

注释

  • >TOM

  • 注释不能嵌套;

  • 可以在除标记以外的任何地方放注释

CDATA节

有些内容不想让解析引擎执行,而是当作原始内容处理(即当做普通文本),可以使用 CDATA 包括起来,CDATA 节中的所有字符都会被当作简单文本,而不是 XML 标记

  • 语法:

    这里可以把你输入的字符原样显示,不会解析 xml

    ]]>

  • 可以输入任意字符(除]]>外)

  • 不能嵌套

转译字符

对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理

&lt; 表示 <

&gt; 表示>

&amp; 表示 &

&quot; 表示 "

&apos; 表示 '

DOM4J

不管是 html 文件还是 xml 文件它们都是标记型文档,都可以使用 w3c 组织制定的 dom 技术来解析

document 对象表示的是整个文档(可以是 html 文档,也可以是 xml 文档)

Dom4j 是一个简单、灵活的开放源代码的库(用于解析/处理 XML 文件)。Dom4j 是由早期 开发 JDOM 的人分离出来而后独立开发的

Dom4j 是一个非常优秀的 Java XML API,具有性能优异、功能强大和极易使用的特点。

现在很多软件采用的 Dom4j。

使用 Dom4j 开发,需下载 dom4j 相应的 jar 文件

Document对象

  • 读取XML文件

    SAXReader reader = new SAXReader(); //创建一个解析器 
    Document document = reader.read(new File("src/input.xml"));//XML Document
    
  • 解析 XML 形式的文本

    String text = "<members></members>"; 
    Document document = DocumentHelper.parseText(text);
    
  • 主动创建 document 对象

    Document document = DocumentHelper.createDocument(); //创建根节点 
    Element root = document.addElement("members");
    
  • 应用案例

    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 org.junit.jupiter.api.Test;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.util.List;
    
    /**
     * @author 韩顺平
     * @version 1.0
     */
    public class Dom4j_ {
    
        /**
         * 演示如何加载xml文件
         */
        @Test
        public void loadXML() throws DocumentException {
            //得到一个解析器
            SAXReader reader = new SAXReader();
            //老师的代码技巧->debug 看看document对象的属性
            //分析了document对象的底层结构
            Document document = reader.read(new File("src/students.xml"));
            System.out.println(document);
    
        }
    
        /**
         * 遍历所有的student信息
         */
        @Test
        public void listStus() throws DocumentException {
            //得到一个解析器
            SAXReader reader = new SAXReader();
            //老师的代码技巧->debug 看看document对象的属性
            //分析了document对象的底层结构
            Document document = reader.read(new File("src/students.xml"));
    
            //1. 得到rootElement, 你是OOP
            Element rootElement = document.getRootElement();
            //2. 得到rootElement的student Elements
            List<Element> students = rootElement.elements("student");
            //System.out.println(student.size());//2
            for (Element student : students) {//element就是Student元素/节点
                //获取Student元素 的name Element
                Element name = student.element("name");
                Element age = student.element("age");
                Element resume = student.element("resume");
                Element gender = student.element("gender");
    
                System.out.println("学生信息= " + name.getText() + " " + age.getText() +
                        " " + resume.getText() + " " + gender.getText());
            }
    
        }
    
        /**
         * 指定读取第一个学生的信息 就是 dom4j+xpath
         */
        @Test
        public void readOne() throws DocumentException {
    
            //得到一个解析器
            SAXReader reader = new SAXReader();
            //老师的代码技巧->debug 看看document对象的属性
            //分析了document对象的底层结构
            Document document = reader.read(new File("src/students.xml"));
    
            //1. 得到rootElement, 你是OOP
            Element rootElement = document.getRootElement();
    
            //2. 获取第一个学生
            Element student = (Element) rootElement.elements("student").get(1);
            //3. 输出该信息
            System.out.println("该学生的信息= " + student.element("name").getText() + " " +
                    student.element("age").getText() + " " + student.element("resume").getText() +
                    student.element("gender").getText());
    
            //4. 获取student元素的属性
            System.out.println("id= " + student.attributeValue("id"));
        }
    
        /**
         * 加元素(要求: 添加一个学生到xml中) [不要求,使用少,了解]
         * @throws Exception
         */
        @Test
        public void add() throws Exception {
    
            //1.得到解析器
            SAXReader saxReader = new SAXReader();
            //2.指定解析哪个xml文件
            Document document = saxReader.read(new File("src/students.xml"));
    
    
            //首先我们来创建一个学生节点对象
            Element newStu = DocumentHelper.createElement("student");
            Element newStu_name = DocumentHelper.createElement("name");
            //如何给元素添加属性
            newStu.addAttribute("id", "04");
            newStu_name.setText("宋江");
            //创建age元素
            Element newStu_age = DocumentHelper.createElement("age");
            newStu_age.setText("23");
            //创建resume元素
            Element newStu_intro = DocumentHelper.createElement("resume");
            newStu_intro.setText("梁山老大");
    
            //把三个子元素(节点)加到 newStu下
            newStu.add(newStu_name);
            newStu.add(newStu_age);
            newStu.add(newStu_intro);
            //再把newStu节点加到根元素
            document.getRootElement().add(newStu);
            //直接输出会出现中文乱码:
            OutputFormat output = OutputFormat.createPrettyPrint();
            output.setEncoding("utf-8");//输出的编码utf-8
    
            //把我们的xml文件更新
            // lets write to a file
            //new FileOutputStream(new File("src/myClass.xml"))
            //使用到io编程 FileOutputStream 就是文件字节输出流
            XMLWriter writer = new XMLWriter(
                    new FileOutputStream(new File("src/students.xml")), output);
            writer.write(document);
            writer.close();
    
        }
    
        /**
         * //删除元素(要求:删除第一个学生) 使用少,了解
         * @throws Exception
         */
        @Test
        public void del() throws Exception {
            //1.得到解析器
            SAXReader saxReader = new SAXReader();
            //2.指定解析哪个xml文件
            Document document = saxReader.read(new File("src/students.xml"));
            //找到该元素第一个学生
            Element stu = (Element) document.getRootElement().elements("student").get(2);
            //删除元素
            stu.getParent().remove(stu);
    //        //删除元素的某个属性
    //        stu.remove(stu.attribute("id"));
            //更新xml
            //直接输出会出现中文乱码:
            OutputFormat output = OutputFormat.createPrettyPrint();
            output.setEncoding("utf-8");//输出的编码utf-8
            //把我们的xml文件更新
            XMLWriter writer = new XMLWriter(
                    new FileOutputStream(new File("src/students.xml")), output);
            writer.write(document);
            writer.close();
            System.out.println("删除成功~");
        }
    
    
        /**
         * //更新元素(要求把所有学生的年龄+3) 使用少,了解
         * @throws Exception
         */
        @Test
        public void update() throws Exception {
    
            //1.得到解析器
            SAXReader saxReader = new SAXReader();
            //2.指定解析哪个xml文件
            Document document = saxReader.read(new File("src/students.xml"));
            //得到所有学生的年龄
            List<Element> students = document.getRootElement().elements("student");
            //遍历, 所有的学生元素的age+3
            for (Element student : students) {
                //取出年龄
                Element age = student.element("age");
                age.setText((Integer.parseInt(age.getText()) + 3) + "");
            }
    
            //更新
            //直接输出会出现中文乱码:
            OutputFormat output = OutputFormat.createPrettyPrint();
            output.setEncoding("utf-8");//输出的编码utf-8
    
            //把我们的xml文件更新
            XMLWriter writer = new XMLWriter(
                    new FileOutputStream(new File("src/students.xml")), output);
            writer.write(document);
            writer.close();
            System.out.println("更新成功~");
        }
    }
    
    


这篇关于XML DOM 基础的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程