09. XML技术

  1. 认识XML

    XML是Extensible Markup Language ,即”可扩展标记语言”的缩写,是一种简单的数据存储语言,使用一系列简单的标记来描述数据,XML技术应用广泛,最基本的 如网站、、应用程序的配置信息一般都是采用XML文件描述。

  2. XML的特点

    1. XML与操作系统,编程语言的开发平台都无关
    2. 规范统一

XML文件结构

  1. XML 声明

    1
    <?xml version="1.0" encoding="UTF-8"?>

    表示声明XML,用来表明该文件是一个XML文档,XML文档总是以XML声明开始,它定义了XML的版本和使用的编码格式等信息

    XML声明由一下几个部分组成:

    1. version:文档符合XML1.0规范
    2. encoding:文档字符编码,默认为UTF-8

    对于任何一个XML文档,其声明部分都是固定的格式


  2. 标签

    在XML中,用尖括号<>括起来的各种标签(Tag)来标记数据,标签需成对使用来界定字符数据,例如

    1
    <authoir>王珊</authoir>

    这一对标签中,是开始标签,是结束标签,王珊是标签描述的内容,表示作者信息

    XML文件可以包含任意数量的标签。


  3. 跟元素

    每个XML文档必须有且仅有一个根元素,如

    根元素的特点如下:

    1. 根元素是一个完全包括文档中其它所有元素的元素
    2. 根元素的起始标签要放在所有其他元素的起始标签之前
    3. 根元素的结束标签要放在所有其他元素的结束标签之后

  4. 元素

    XML文档的主要部分是元素,元素有开始标签,元素内容和结束标签组成,元素内容可以包含子元素,字符数据等,如王珊就是一个元素

    元素的命名规则如下:

    1. 名称中可以包含字母、数字或者其它字符
    2. 名称不能以数字或者标签符号开始
    3. 名称以字符xml或者XML、Xml开始
    4. 名称中不能包含空格

    注意:

    1. XML标签必须成对出现并正确嵌套
    2. 元素允许是空元素

  5. 属性

    在描述图书信息的XML文档中,标签使用的id属性描述图书的编号信息

    属性定义语法格式如下:

    1
    <元素名 属性名="属性值">

    属性值用一对引号包起来。

    注意:

    1. 一个元素可以有多个属性,它的基本格式为<元素名 属性名=”属性值” 属性名=“属性值”>,多个属性之间用空格隔开。
    2. 属性值中不能直接包含< “ & 等字符
    3. 属性可以加在任何一个元素的起始标签上, 但不能加到结束标签上

  6. XML中特殊字符的处理

    在XML中,有时候在元素的文本中会出现一个特殊字符(如 < > ‘ “ &),而xml文档结构本身就用到了这几个特殊字符,有以下两种方法可以正确解析特殊字符的内容

    1. 对这5个特殊字符进行转义

      实体名称 字符
      &lt; <
      &gt; >
      &amp; &
      &quot;
      &aops;
    2. 如果在元素的文本中有大量的特殊字符,可以使用CDATA节处理

      CDATA节中的所有字符都会被当作元素字符数据的常量部分,而不是xml标签

      定义CDATA节的语法如下:

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

  7. XML中的注释

    注释的语法格式如下:

    1
    <!---注释内容--->

  8. 格式良好的XML文档

    格式良好的XML文档需要遵循如下规则:

    1. 必须有XML声明语句
    2. 必须有且仅有一个根元素
    3. 标签大小写敏感
    4. 属性值用双引号包起来
    5. 标签成对出现
    6. 元素正确嵌套

XML文档的验证

  1. DTD验证

    DTD是Document Type Definition ,文档类型定义的缩写,dtd用来描述xml文档的结构,一个dtd可能包含如下内容:

    1. 元素定义的规则
    2. 元素之间的关系规则
    3. 属性的定义规则

    DTD的作用:使每个xml文件可以携带一个自身格式的描述,使不同组织的人可以使用通用dtd来交换数据,验证数据有效性

    声明DTD的语法:

    1
    2
    3
    4
    5
    6
    7
    <!DOCTYPE 根元素  [定义内容]>
    <!ELEMENT students (student*)>
    <!ELEMENT student (name,age,sex)>
    <!ATTLIST student id CDATA #REQUIRED>
    <!ELEMENT name (#PCDATA)>
    <!ELEMENT age (#PCDATA)>
    <!ELEMENT sex (#PCDATA)>
  2. Schema验证

    Schema是用一套预先规定的xml元素和属性创建的,这些元素和属性定义了xml文档的结构和内容模式,规定了xml文档的结构和每个元素属性的数据类型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?xml version="1.0" encoding="UTF-8"?>
    <schema xmlns="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org/MyXML"
    xmlns:tns="http://www.example.org/MyXML"
    elementFormDefault="qualified">
    <element name="students">
    <complexType>
    <sequence>
    <element name="student" maxOccurs="unbounded">
    <complexType>
    <sequence>
    <element name="name" type="string"></element>
    <element name="age" type="integer"></element>
    <element name="sex" type="string"></element>
    </sequence>
    <attribute name="id" type="integer"></attribute>
    </complexType>
    </element>
    </sequence>
    </complexType>
    </element>
    </schema>

生成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
30
31
32
33
34
35
36
37
38
39
//创建XML的文档对象
Document doc = DocumentHelper.createDocument();
//创建文档的跟节点
Element rootEle = doc.addElement("pets");
Element dogsEle = rootEle.addElement("dogs");
Element dog1Ele = dogsEle.addElement("dog");
dog1Ele.addAttribute("id", "1");
Element dog1NameEle = dog1Ele.addElement("name");
dog1NameEle.addText("旺财");
dog1Ele.addElement("health").addText("90");
dog1Ele.addElement("love").addText("90");

Element dog2Ele = dogsEle.addElement("dog");
dog2Ele.addAttribute("id", "2");
dog2Ele.addElement("name").addText("旺财1");
dog2Ele.addElement("health").addText("80");
dog2Ele.addElement("love").addText("80");

Element penguinsEle = rootEle.addElement("penguins");

Element pen1Ele = penguinsEle.addElement("penguin");
pen1Ele.addAttribute("id", "3");
pen1Ele.addElement("name").addText("阿腾");
pen1Ele.addElement("health").addText("90");
pen1Ele.addElement("love").addText("20");

Element pen2Ele = penguinsEle.addElement("penguin");
pen2Ele.addAttribute("id", "4");
pen2Ele.addElement("name").addText("阿腾1");
pen2Ele.addElement("health").addText("90");
pen2Ele.addElement("love").addText("20");

FileWriter fw = new FileWriter("Pets.xml");
OutputFormat f = OutputFormat.createPrettyPrint();
f.setEncoding("UTF-8");
XMLWriter xmlWriter = new XMLWriter(fw,f);
xmlWriter.write(doc);
xmlWriter.close();
System.out.println("成功!");

获取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
//		创建要操作的xml的文件对象
File file = new File("D:\\MyXML.xml");
// 创建对象用来读取xml文件信息
SAXReader reader = new SAXReader();
// 将读取到的xml信息放入文档对象中
Document doc = reader.read(file);
// 获取xml文档的跟元素
Element rootEle = doc.getRootElement();
// 获取跟元素中所有的子元素
List<Element> studentEles = rootEle.elements();
// 循环所有的子元素,获取对应的信息
for (Element stuEle : studentEles) {
// 获取元素属性值的第一种方式 先获取属性对象,然后再获取值
Attribute attr = stuEle.attribute("id");
System.out.println(attr.getValue());
// 获取元素属性值的第二种方式 直接获取指定属性名称的值
System.out.println(stuEle.attributeValue("id"));
// 获取元素子元素内容的第一种方式 先获取子元素对象,然后再获取内容
Element nameEle = stuEle.element("name");
System.out.println("姓名:"+nameEle.getText());
// 获取元素子元素内容的第二种方式 直接获取指定子元素名称的内容
System.out.println("姓名:"+stuEle.elementText("name"));

System.out.println("年龄::"+stuEle.elementText("age"));
System.out.println("性别:"+stuEle.elementText("sex"));