XML特点及其总结


XML介绍与用途

什么是XML

  • XML的全称是EXtensible Markup Language,可扩展标记语言。
  • 编写XML就是编写标签,与HTML非常类似,扩展名.xml
  • 良好的人机可读性。
<employee>
    <name>张三</name>
    <age>31</age>
    <height>178</height>
</employee>

XML与HTML的比较

  • XML与HTML非常相似,都是编写标签。
  • XML没有预定义标签,HTML存在大量预定义标签。
  • XML重在保存和传输数据,HTML用于显示信息。

XML与HTML的比较示意图

XML用途

  • Java程序的配置描述文件。

Web配置文件示例

  • 用于保存程序产生的数据

数据包裹示意图

  • 网络间的数据传输

网络数据包裹示意图

XML的文档结构

  • 第一行必须是XML声明;
  • 有且仅有一个根节点;
  • XML标签的书写规则与HTML相同。

XML声明

  • XML声明说明了XML文档的基本信息,包括版本号与字符集,写在XML第一行。
<?xml version="1.0" encoding="UTF-8"?>
<!-- 版本号常见为1.0/1.1 -->
<!-- UTF-8字符集,用于支持中文 -->

XML语法检查方法

  • 使用浏览器可以直接检查XML文件,直接把XML文件拖入浏览器就可以了。

XML的语法规则

合法的标签名

  • 标签名要有意义;
  • 建议标签名使用英文小写字母,单词直接使用”-“进行分割;
  • 建议多级标签之间不要存在重名的情况。

适当的注释与缩进

  • 适当的注释与缩进可以让XML文档更容易阅读

合理使用属性

  • 标签属性用于描述标签不可或缺的信息;
  • 对标签分组或者为标签设置Id时常用属性表示;
  • 唯一的身份信息一般作为属性表示。

合理的属性使用示例

处理特殊字符

  • 标签体中,出现<``>等字符,会破坏文档结构,使文件没有办法被正确解析。

  • 解决方案1:使用实体引用;

  • 解决方案2:使用CDATA标签。

    • CDATA指的是不应由XML解析器解析的文本数据
    • <![CDATA[开始,到]]>结束

XML支持的实体引用示意图

有序的子元素

  • 在XML多层嵌套的子元素中,标签前后顺序应该保持一致,这是约定俗成的表达方法,虽然不这样写不会出现错误,但不利于阅读。

XML语义约束

  • XML文档结构正确,但可能不是有效的。
  • XML语义约束就是用于规定XML文档中允许出现哪些元素
  • XML语义约束有两种定义方式:DTD和XML Schema

Document Type Definition

  • DTD(Document Type Definition,文档类型定义)是一种简单易用的语义约束方式;
  • DTD文件的扩展名为.dtd。
<!-- 定义了hr节点下只允许出现1个employee子节点 -->
<!ELEMENT hr(employee)>

<!-- employee节点下必须包含以下四个节点,且按顺序出现 -->
<!ELEMENT employee(name,age,salary,department)>

<!-- 设置节点属性值 节点名称 属性名称 值的类型 默认值 -->
<!ATTLIST employee no CDATA "">

<!-- 定义name标签体只能是文本,#PCDATA代表文本元素 -->
<!ELEMENT name(#PCDATA)>

DTD定义结点及节点数量

  • 利用DTD中的<!ELEMENT>标签,我们可以定义XML文档中允许出现的节点及数量。
  • 如果某个子节点需要多次重复出现,则需要在子节点后增加相应的描述符。
<!-- hr节点下最少出现1个employee子节点 -->
<!ELEMENT hr(employee+)>
<!-- hr节点下出现0~n个employee子节点 -->
<!ELEMENT hr(employee*)>
<!-- hr节点下最多出现1个employee子节点 -->
<!ELEMENT hr(employee?)>

XML引用DTD文件

  • 在XML中使用<!DOCTYPE>标签来引用DTD文件
<!-- 书写格式 -->
<!DOCTYPE 根节点 SYSTEM "dtd文件路径">
<!-- 示例: -->
<!DOCTYPE hr SYSTEM "hr.dtd">

XML Schema

  • XML Schema比DTD更复杂,提供了更多的功能;
  • XML Schema提供了数据类型、格式限定、数据范围等特性;
  • XML Schema是W3C标准。
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
    <element name="hr">
<!--complexType标签含义是复杂节点,包含子节点时必须使用这个标签-->
        <complexType>
            <sequence>
                <element name="employee" minOccurs="1" maxOccurs="unbounded">
                    <complexType>
                        <sequence>
                            <element name="name" type="string"/>
                            <element name="age" type="integer"/>
                            <element name="salary" type="integer"/>
                            <element name="department">
                                <complexType>
                                    <sequence>
                                        <element name="dname" type="string"/>
                                        <element name="address" type="string"/>
                                    </sequence>
                                </complexType>
                            </element>
                        </sequence>
                        <attribute name="no" type="string" use="required"/>
                    </complexType>
                </element>
            </sequence>
        </complexType>
    </element>
</schema>

Java解析XML

  • DOM(Document Object Model)定义了访问和操作XML文档的标准方法,DOM把XML文档作为树结构来查看,能够通过DOM树来读写所有元素。

Dom4j

  • Dom4j是一个易用的、开源的库,用于解析XML。它应用于Java平台,具有性能优异、功能强大和极其易使用的特点。
  • Dom4j将XML视为Document对象。
  • XML标签被Dom4j视为Element对象

XPath路径表达式

  • XPath路径表达式是XML文档中查询数据的语言;
  • 掌握XPath可以极大得提高在提取数据时的开发效率;
  • 学习XPath本质就是掌握各种形式表达式的使用技巧。

Jaxen介绍

  • Jaxen是一个Java编写的开源的XPath库。这是适应多种不同那个的对象模型,包括DOM,XOM,dom4j和JDOM。
  • Dom4j底层以来Jaxen实现XPath查询
  • Jaxen下载地址:jaxen.codehaus.org

XPath基本表达式示意图

XPath基本表达式案例示意图

XPath谓语表达式示意图

  • xpath实例代码
xpt.xpath("/hr/employee");    //显示根节点下的所有员工
xpt.xpath("//employee");  //显示所有员工
xpt.xpath("//employee[salary<4000]"); //显示工资小于4000的员工
xpt.xpath("//employee[name='李铁柱']");  //显示姓名为李铁柱的员工
xpt.xpath("//employee[@no=3310]");    //显示工号为3310的员工
xpt.xpath("//employee[1]");   //显示第一名员工
xpt.xpath("//employee[last()]");  //显示最后的一名员工
xpt.xpath("//employee[position()<6]");    //显示前六名员工
xpt.xpath("//employee[3] | //employee[8]"); //同时显示第3名和第8名员工

文章作者: 南航古惑仔
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 南航古惑仔 !
  目录