ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

XML DOM 基础

2022-04-15 22:33:01  阅读:90  来源: 互联网

标签:XML xml DOM 基础 Element student new newStu document


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,xml,DOM,基础,Element,student,new,newStu,document
来源: https://www.cnblogs.com/shaozelong/p/16151269.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有