一. 什么是XML

XML(e**X**tensible **M**arkup **L**anguage),是一种可扩展的标记语言,是一种用于标记电子文件使其具有结构性的标记语言。

XML技术是\W3C**组织(World Wide Web Consortium万维网联盟)发布的,目前遵循的是W3C组织于1998年2月10日发布的XML1.0规范。

二. 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE books SYSTEM "books.dtd">
<!--
<:&lt;
>:&gt;
&:&amp;
-->
<books><!-- 根标签-头标签,不能有跟根标签平级的其他标签 -->
<book id="001" publish="四川出版社">
<name>《斗罗大陆》</name>
<price>199.00</price>
</book>
<book id="002">
<name>《斗破苍穹》</name>
<price>299.00&amp;199.00</price>
</book>
<book id="003">
<name>《平凡的世界》</name>
<price>99.0 &lt; money &lt; 199.0</price>
<!--里面写特殊字符-->
<![CDATA[>&<><><><><>]]>
</book>
</books>

三. 语法

  1. <?xml version=“1.0” encoding=“UTF-8”?>

  2. 特殊字符

    image-20220720153606230

  3. XML文档约束

    • dtd约束:Document Type Definition文档类型定义,它使用一系列的合法元素来定义文档结构**。**

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      使用ELEMENT关键字来声明一个XML元素
      语法:<!ELEMENT 元素名称 使用规则>
      文档类型声明以<!DOCTYPE开始,然后是根标签的名字。
      使用规则:
      (#PCDATA):指示元素的主体内容只能是普通的文本. (Parsed Character Data)
      EMPTY:用于指示元素的主体为空。比如<br/>
      ANY:用于指示元素的主体内容为任意类型
      (子元素):指示元素中包含的子元素
      定义子元素及描述它们的关系:
      如果子元素用逗号分开,说明必须按照声明顺序去编写XML文档。
      如果子元素用“|”分开,说明任选其一。
      用+、*、?来表示元素出现的次数
      如果元素后面没有+*?:表示必须且只能出现一次
      +:表示至少出现一次,一次或多次
      *:任意次。表示可有可无,零次、一次或多次
      ?:表示可以有也可以无,有的话只能有一次。零次或一次

    • books.xml进行约束

      1
      2
      3
      4
      5
      6
      <!ELEMENT books (book+)>
      <!ELEMENT book (name,price)>
      <!ELEMENT name (#PCDATA)>
      <!ELEMENT price (#PCDATA)>
      <!ATTLIST book id>
      <!ATTLIST book publish>
    • schema约束

      • 在上面的dtd约束中,我们发现,约束文件本身只是一个文本文件,在属性约束文件的时候,也是容易出现错误的,所以,这种约束存在较大的限制性。所以,需要另外一种更加强大的约束:schema约束。Schema的功能比dtd更加强大,但是配置起来更加复杂!

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        <?xml version="1.0" encoding="UTF-8" ?>
        <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://coderyech.cn" elementFormDefault="qualified">
        <xs:element name="books">
        <xs:complexType>
        <xs:sequence maxOccurs='unbounded'>
        <xs:element name="book">
        <xs:complexType>
        <xs:sequence>
        <xs:element name='name' type='xs:string' />
        <xs:element name='price' type='xs:double' />
        </xs:sequence>
        <xs:attribute name="id" type="xs:long" use="required"/>
        </xs:complexType>
        </xs:element>
        </xs:sequence>
        </xs:complexType>
        </xs:element>
        </xs:schema>

四. DOM模型

  1. DOM:文档对象模型,将一个XML(html)文档的每一个\元素**解析成Java中的一个对象
D Document 文档(XML文档) : 磁盘上面的xml文件
O Object 对象(Java对象) : 把xml文件中成员转换成Java对象
M Model 模型:xml文件与Java中对象一一对应的关系
  1. 在Java使用了如下类型来描述上面的xml文档

    | Node(节点) |
    | :——————— |
    | Element (元素) |
    | Attribute(属性) |
    | Text(文本) |

    res

五. DOM4J (Document Object Model for Java)

  1. 导入资源包,地址

  2. 准备一个xml文件,对其进行增删改查

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <?xml version="1.0" encoding="UTF-8"?>

    <contacts>
    <linkman id="100">
    <name>gg</name>
    <email>[email protected]</email>
    <address>成都</address>
    <group>二仙桥</group>
    </linkman>
    <linkman id="200">
    <name>mm</name>
    <email>[email protected]</email>
    <address>成都</address>
    <group>成华大道</group>
    </linkman>
    <linkman id="500">
    <name>coderyeah</name>
    <email>[email protected]</email>
    <address>上海</address>
    <group>松江大学城</group>
    </linkman>
    <linkman id="600">
    <name>莱昂纳多</name>
    <email>[email protected]</email>
    <address>美国纽约</address>
    <group>好莱坞</group>
    </linkman>
    </contacts>

  3. 测试类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    public class Dom4jTest {
    @Test
    public void testDel() throws Exception {
    final File file = new File("E:\\javabase\\practiceDemo\\src\\com\\lqs\\xmlTest\\dtd\\contacts.xml");

    //删除最后一个linkman节点
    SAXReader reader = new SAXReader();
    final Document dom = reader.read(file);
    final Element root = dom.getRootElement();
    final List<Element> elements = root.elements();
    //获取集合最后一个节点
    final Element element = elements.get(elements.size() - 1);
    //通过获取父节点删除自身节点
    final boolean remove = element.getParent().remove(element);
    //将修改的dom写出文件去
    XMLWriter writer = new XMLWriter(new FileWriter(file), OutputFormat.createPrettyPrint());
    writer.write(dom);
    writer.close();
    if (remove) {
    System.out.println("删除成功");
    }
    }


    @Test
    public void testAdd() throws DocumentException, IOException {
    final File file = new File("E:\\javabase\\practiceDemo\\src\\com\\lqs\\xmlTest\\dtd\\contacts.xml");
    //在根节点新增一个linkman节点
    SAXReader saxReader = new SAXReader();
    //获取dom对象
    final Document dom = saxReader.read(file);
    final Element rootElement = dom.getRootElement();//得到根接点
    //添加新节点 返回的是新添加节点
    final Element element = rootElement.addElement("linkman");
    //在新节点下添加其他节点 和属性
    element.addAttribute("id", "600");
    element.addElement("name").setText("莱昂纳多");
    element.addElement("email").setText("[email protected]");
    element.addElement("address").setText("美国纽约");
    element.addElement("group").setText("好莱坞");
    //同步文本到文件
    OutputFormat format = OutputFormat.createPrettyPrint();//格式化写入 更美观
    // final OutputFormat format = OutputFormat.createCompactFormat();//使其不格式化 不美观
    XMLWriter writer = new XMLWriter(new FileWriter(file), format);
    writer.write(dom);
    writer.close();
    }

    @Test
    public void testUpdate() throws DocumentException, IOException {
    //修改linkman的id为500的name为coderyeah
    //1.创建对象
    SAXReader reader = new SAXReader();
    final File file = new File("E:\\javabase\\practiceDemo\\src\\com\\lqs\\xmlTest\\dtd\\contacts.xml");
    //2.得到文本对象
    final Document dom = reader.read(file);
    //3.获取根节点
    final Element rootElement = dom.getRootElement();
    //4.获取根节点下的所有子元素
    final List<Element> elements = rootElement.elements();
    //5.遍历集合
    for (Element element : elements) {
    if ("500".equals(element.attributeValue("id"))) {
    //6.获取当前节点下的name节点
    final Element name = element.element("name");
    //7.给节点text重新赋值
    name.setText("coderyeah");
    //8.同步文本--把内存中的文本同步到文件中
    //9.创建文本同步对象
    XMLWriter writer = new XMLWriter(new FileWriter(file));
    writer.write(dom);//写出文档
    writer.close();
    }
    }

    }

    @Test
    public void testQuery() throws DocumentException {
    SAXReader saxReader = new SAXReader();
    //获取DOM文档对象
    final Document document = saxReader.read(new File("E:\\javabase\\practiceDemo\\src\\com\\lqs\\xmlTest\\dtd\\contacts.xml"));
    //获取根节点
    final Element rootElement = document.getRootElement();
    System.out.println(rootElement);
    //获取根节点下所有linkman元素
    final List<Element> elements = rootElement.elements();
    System.out.println(elements.size());//3
    //查询id为200的name值
    for (Element element : elements) {
    //获取id值
    // System.out.println(element.attribute("id"));
    final Attribute attribute = element.attribute("id");
    // System.out.println(attribute.getValue());//得到所有id值
    System.out.println("---------------------");
    System.out.println(element.attributeValue("id"));//也可以得到所有id值
    if ("500".equals(element.attributeValue("id"))) {
    System.out.println("d为200的name值=" + element.element("name").getText());
    System.out.println("d为200的address值=" + element.element("address").getText());
    System.out.println("d为200的group值=" + element.element("group").getText());
    }
    }

    }

    @Test
    public void testOne() throws DocumentException {
    SAXReader saxReader = new SAXReader();
    final Document document = saxReader.read(new File("E:\\javabase\\practiceDemo\\src\\com\\lqs\\xmlTest\\dtd\\contacts.xml"));
    System.out.println(document);//获取文档

    }


    @Test
    public void selectTest() throws DocumentException {
    //建SaxReader对象
    SAXReader reader = new SAXReader();
    //读取待解析的xml文件 得到文档模型
    final Document document = reader.read(new File("E:\\javabase\\practiceDemo\\src\\com\\lqs\\xmlTest\\books.xml"));
    //获取根节点
    final Element rootElement = document.getRootElement();
    System.out.println("根节点标签名:" + rootElement.getName());//books
    final Element element = rootElement.element("book");
    System.out.println(element.attribute("id"));
    }
    }