XML新手入门必知必会

简介: XML是开发人员必知必会的知识点,本文为新手读者介绍XML的基础知识。

XML语法规则纲要

  • XML文档必须有且只有一个根元素
  • XML元素都必须有一个关闭标签
  • XML标签对大小写敏感
  • XML元素必须被正确的嵌套
  • XML属性值必须加引号

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

对于下面的XML文档:

<?xml version="1.0" encoding="UTF-8" ?>
<SALES>
    <ORDER>
        <ORDERITEM>
            <PRODUCT>
                <CODE>A001</CODE>
                <DESCRIPTION>Almond Flavored Syrup</DESCRIPTION>
                <PRICE>9.0</PRICE>
            </PRODUCT>
            <QUANTITY>3</QUANTITY>
        </ORDERITEM>
        <ORDERITEM>
            <PRODUCT>
                <CODE>A002</CODE>
                <DESCRIPTION>Irish Creme Flavored Syrup</DESCRIPTION>
                <PRICE>9.0</PRICE>
            </PRODUCT>
            <QUANTITY>5</QUANTITY>
        </ORDERITEM>
    </ORDER>
    <ORDER>
        <ORDERITEM>
            <PRODUCT>
                <CODE>A001</CODE>
                <DESCRIPTION>Almond Flavored Syrup</DESCRIPTION>
                <PRICE>9.0</PRICE>
            </PRODUCT>
            <QUANTITY>1</QUANTITY>
        </ORDERITEM>
        <ORDERITEM>
            <PRODUCT>
                <CODE>A004</CODE>
                <DESCRIPTION>Caramel Flavored Syrup</DESCRIPTION>
                <PRICE>9.0</PRICE>
            </PRODUCT>
            <QUANTITY>2</QUANTITY>
        </ORDERITEM>
        <ORDERITEM>
            <PRODUCT>
                <CODE>A006</CODE>
                <DESCRIPTION>Gourmet Coffee Travel Thermo</DESCRIPTION>
                <PRICE>18.0</PRICE>
            </PRODUCT>
            <QUANTITY>3</QUANTITY>
        </ORDERITEM>
    </ORDER>
    <ORDER>
        <ORDERITEM>
            <PRODUCT>
                <CODE>A009</CODE>
                <DESCRIPTION>Gourmet Coffee 36 Cup Filters</DESCRIPTION>
                <PRICE>45.0</PRICE>
            </PRODUCT>
            <QUANTITY>100</QUANTITY>
        </ORDERITEM>
    </ORDER>
</SALES>

删去根元素\<SALES>:

<?xml version="1.0" encoding="UTF-8" ?>
<ORDER>
    <ORDERITEM>
        <PRODUCT>
            <CODE>A001</CODE>
            <DESCRIPTION>Almond Flavored Syrup</DESCRIPTION>
            <PRICE>9.0</PRICE>
        </PRODUCT>
        <QUANTITY>3</QUANTITY>
    </ORDERITEM>
    <ORDERITEM>
        <PRODUCT>
            <CODE>A002</CODE>
            <DESCRIPTION>Irish Creme Flavored Syrup</DESCRIPTION>
            <PRICE>9.0</PRICE>
        </PRODUCT>
        <QUANTITY>5</QUANTITY>
    </ORDERITEM>
</ORDER>
<ORDER>
    <ORDERITEM>
        <PRODUCT>
            <CODE>A001</CODE>
            <DESCRIPTION>Almond Flavored Syrup</DESCRIPTION>
            <PRICE>9.0</PRICE>
        </PRODUCT>
        <QUANTITY>1</QUANTITY>
    </ORDERITEM>
    <ORDERITEM>
        <PRODUCT>
            <CODE>A004</CODE>
            <DESCRIPTION>Caramel Flavored Syrup</DESCRIPTION>
            <PRICE>9.0</PRICE>
        </PRODUCT>
        <QUANTITY>2</QUANTITY>
    </ORDERITEM>
    <ORDERITEM>
        <PRODUCT>
            <CODE>A006</CODE>
            <DESCRIPTION>Gourmet Coffee Travel Thermo</DESCRIPTION>
            <PRICE>18.0</PRICE>
        </PRODUCT>
        <QUANTITY>3</QUANTITY>
    </ORDERITEM>
</ORDER>
<ORDER>
   <ORDERITEM>
        <PRODUCT>
            <CODE>A009</CODE>
            <DESCRIPTION>Gourmet Coffee 36 Cup Filters</DESCRIPTION>
            <PRICE>45.0</PRICE>
        </PRODUCT>
        <QUANTITY>100</QUANTITY>
    </ORDERITEM>
</ORDER>

就会解析错误:
在这里插入图片描述

错因在第20行的\<ORDER>上,也就是说,新的XML文档在被浏览器解析的时候默认了\<ORDER>是根元素,而第一次\<\ORDER>出现的时候,意味着整个XML文档的结束,后面仍有\<ORDER>就不合法,XML文档树可不是森林,必须单根。

XML元素都必须有一个关闭标签

HTML中经常有不写关闭标签的情况而并不会解析错误。即使是HTML5,也被迫向某些陋习妥协了,比如\<p>等等。

但是XML语法要求严格,标签必须被关闭。

如果我们删去上面代码最后一行的\<\SALES>,就会解析错误:
在这里插入图片描述
在这里插入图片描述

当然了,我们这时以根元素举的例子,错误原因来自于文档解析到结尾仍没出现根元素\<SALES>的关闭标签\<\SALES>,这是不被允许的。

事实上,任何XML元素都是如此。

XML标签对大小写敏感

一般的编程语言都对大小写敏感。XML虽不是编程语言,但也对大小写敏感。

也就是说\<SALES>与\<sales>是完全不同的标签。

我们将上面代码的最后一行的\<\SALES>换成\<\sales>:
在这里插入图片描述

显示解析错误:
在这里插入图片描述

再换成\<HHH>,看看解析情况:
在这里插入图片描述
在这里插入图片描述

都是“非配对的标签”。

XML元素必须被正确的嵌套

这个问题是说,比如我们\<SALES>嵌套了\<ORDER>,收尾顺序就得是先\<\ORDER>后\<\SALES>,有栈的意味。

如果胆敢出现FIFO队列式的先\<\SALES>后\<\ORDER>,就算嵌套错误,导致解析错误。

XML属性值必须加引号

有关属性的问题我在这篇文章中已经讲过很详细了,就不再细说。

必须注意的一点是:XML属性值必须加引号。

XML属性其实换成JSON显得更直白,就和Python的字典一个样子,key:value式的KV对,只不过这个value不管是什么值,都必须加引号,就比如下面的例子:

<PRODUCT id="202003010001">

不能写成下面的样子:

<PRODUCT id=202003010001>

XML不管属性值是不是数值,反正必须加引号!!!

Demo-XML文档

这份代码是自己以前写的一篇博文中的:

<?xml version="1.0" encoding="UTF-8" ?>
<SALES>
    <ORDER>
        <ORDERITEM>
            <PRODUCT>
                <CODE>A001</CODE>
                <DESCRIPTION>Almond Flavored Syrup</DESCRIPTION>
                <PRICE>9.0</PRICE>
            </PRODUCT>
            <QUANTITY>3</QUANTITY>
        </ORDERITEM>
        <ORDERITEM>
            <PRODUCT>
                <CODE>A002</CODE>
                <DESCRIPTION>Irish Creme Flavored Syrup</DESCRIPTION>
                <PRICE>9.0</PRICE>
            </PRODUCT>
            <QUANTITY>5</QUANTITY>
        </ORDERITEM>
    </ORDER>
    <ORDER>
        <ORDERITEM>
            <PRODUCT>
                <CODE>A001</CODE>
                <DESCRIPTION>Almond Flavored Syrup</DESCRIPTION>
                <PRICE>9.0</PRICE>
            </PRODUCT>
            <QUANTITY>1</QUANTITY>
        </ORDERITEM>
        <ORDERITEM>
            <PRODUCT>
                <CODE>A004</CODE>
                <DESCRIPTION>Caramel Flavored Syrup</DESCRIPTION>
                <PRICE>9.0</PRICE>
            </PRODUCT>
            <QUANTITY>2</QUANTITY>
        </ORDERITEM>
        <ORDERITEM>
            <PRODUCT>
                <CODE>A006</CODE>
                <DESCRIPTION>Gourmet Coffee Travel Thermo</DESCRIPTION>
                <PRICE>18.0</PRICE>
            </PRODUCT>
            <QUANTITY>3</QUANTITY>
        </ORDERITEM>
    </ORDER>
    <ORDER>
        <ORDERITEM>
            <PRODUCT>
                <CODE>A009</CODE>
                <DESCRIPTION>Gourmet Coffee 36 Cup Filters</DESCRIPTION>
                <PRICE>45.0</PRICE>
            </PRODUCT>
            <QUANTITY>100</QUANTITY>
        </ORDERITEM>
    </ORDER>
</SALES>

树形抽象

在这里插入图片描述

XML与树形结构

XML文档必须有一个根元素,自己指定即可,在样例XML里是\<SALES>~\<\SALES>。

XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的叶子结点。

以样例XML为例,树形结构如下:

  • \<SALES>

    • \<ORDER>

      • \<ORDERITEM>

        • \<PRODUCT>

          • \<CODE>
          • \<DESCRIPTION>
          • \<PRICE>
        • \<QUANTITY>

我的XML文档就是按照Java代码中的依赖关系设计的。

父、子以及兄弟等术语用于描述XML元素之间的关系,类似于数据结构的树。
父元素下是子元素。
相同层上的子元素互为兄弟元素。

所有的XML元素都可以有文本内容和属性(类似 HTML)。

XML属性

XML也可以指定属性的,比如下面的代码

<?xml version="1.0" encoding="UTF-8" ?>
<SALES>
    <ORDER>
        <ORDERITEM>
            <PRODUCT>
                <CODE>A001</CODE>
                <DESCRIPTION>Almond Flavored Syrup</DESCRIPTION>
                <PRICE>9.0</PRICE>
            </PRODUCT>
            <QUANTITY>3</QUANTITY>
        </ORDERITEM>
        <ORDERITEM>
            <PRODUCT>
                <CODE>A002</CODE>
                <DESCRIPTION>Irish Creme Flavored Syrup</DESCRIPTION>
                <PRICE>9.0</PRICE>
            </PRODUCT>
            <QUANTITY>5</QUANTITY>
        </ORDERITEM>
    </ORDER>
    <ORDER>
        <ORDERITEM>
            <PRODUCT>
                <CODE>A001</CODE>
                <DESCRIPTION>Almond Flavored Syrup</DESCRIPTION>
                <PRICE>9.0</PRICE>
            </PRODUCT>
            <QUANTITY>1</QUANTITY>
        </ORDERITEM>
        <ORDERITEM>
            <PRODUCT>
                <CODE>A004</CODE>
                <DESCRIPTION>Caramel Flavored Syrup</DESCRIPTION>
                <PRICE>9.0</PRICE>
            </PRODUCT>
            <QUANTITY>2</QUANTITY>
        </ORDERITEM>
        <ORDERITEM>
            <PRODUCT>
                <CODE>A006</CODE>
                <DESCRIPTION>Gourmet Coffee Travel Thermo</DESCRIPTION>
                <PRICE>18.0</PRICE>
            </PRODUCT>
            <QUANTITY>3</QUANTITY>
        </ORDERITEM>
    </ORDER>
    <ORDER>
        <ORDERITEM>
            <PRODUCT>
                <CODE>A009</CODE>
                <DESCRIPTION>Gourmet Coffee 36 Cup Filters</DESCRIPTION>
                <PRICE>45.0</PRICE>
            </PRODUCT>
            <QUANTITY>100</QUANTITY>
        </ORDERITEM>
    </ORDER>
</SALES>

也可以改成:

<?xml version="1.0" encoding="UTF-8" ?>
<SALES>
    <ORDER>
        <ORDERITEM>
            <PRODUCT code="A001" description="Almond Flavored Syrup" price="9.0"></PRODUCT>
            <QUANTITY>3</QUANTITY>
        </ORDERITEM>
        <ORDERITEM>
            <PRODUCT code="A002" description="Irish Creme Flavored Syrup" price="9.0"></PRODUCT>
            <QUANTITY>5</QUANTITY>
        </ORDERITEM>
    </ORDER>
    <ORDER>
        <ORDERITEM>
            <PRODUCT code="A001" description="Almond Flavored Syrup" price="9.0"></PRODUCT>
            <QUANTITY>1</QUANTITY>
        </ORDERITEM>
        <ORDERITEM>
            <PRODUCT code="A004" description="Caramel Flavored Syrup" price="9.0"></PRODUCT>
            <QUANTITY>2</QUANTITY>
        </ORDERITEM>
        <ORDERITEM>
            <PRODUCT code="A006" description="Gourmet Coffee Travel Thermo" price="18.0"></PRODUCT>
            <QUANTITY>3</QUANTITY>
        </ORDERITEM>
    </ORDER>
    <ORDER>
        <ORDERITEM>
            <PRODUCT code="A009" description="Gourmet Coffee 36 Cup Filters" price="45.0"></PRODUCT>
            <QUANTITY>100</QUANTITY>
        </ORDERITEM>
    </ORDER>
</SALES>

浏览器解析

在这里插入图片描述

有关XML属性必知必会

  • 元素的属性表示了元素的额外信息
  • 元素的属性值要加引号,必须加引号
  • 元素的多个属性之间使用空格(“ ”)来分隔
  • 某个元素的某个属性只能有一个值
  • ……

XML属性要慎用

XML的属性不建议大量使用,因为这不是我们使用XML而想看到的。

列举三点因使用属性而可能引起的一些问题:

  • 属性不能包含多个值(元素可以)
  • 属性不能包含树结构(元素可以)
  • 属性不容易扩展(难以应对未来的变化)

XML具有扩展性好的优点,但属性的滥用会带来XML文档的低可读性和低可维护性。
我们应该尽量使用元素来描述数据,而仅仅使用属性来提供与数据无关的信息。

特别是上面的例子,绝对不可取。这种用法,是典型的错误用法,我只是为了表示二者可以转化而已。。。

XML属性的健康使用

有时候会向元素分配 id 引用。这些 id 索引可用于唯一标识 XML 元素,它起作用的方式与 HTML 中 id 属性是类似的。

比如下面的代码:

<?xml version="1.0" encoding="UTF-8" ?>
<SALES>
    <ORDER>
        <ORDERITEM>
            <PRODUCT id="202003010001">
                <CODE>A001</CODE>
                <DESCRIPTION>Almond Flavored Syrup</DESCRIPTION>
                <PRICE>9.0</PRICE>
            </PRODUCT>
            <QUANTITY>3</QUANTITY>
        </ORDERITEM>
        <ORDERITEM>
            <PRODUCT id="202003010002">
                <CODE>A002</CODE>
                <DESCRIPTION>Irish Creme Flavored Syrup</DESCRIPTION>
                <PRICE>9.0</PRICE>
            </PRODUCT>
            <QUANTITY>5</QUANTITY>
        </ORDERITEM>
    </ORDER>
    <ORDER>
        <ORDERITEM>
            <PRODUCT id="202003010003">
                <CODE>A001</CODE>
                <DESCRIPTION>Almond Flavored Syrup</DESCRIPTION>
                <PRICE>9.0</PRICE>
            </PRODUCT>
            <QUANTITY>1</QUANTITY>
        </ORDERITEM>
        <ORDERITEM>
            <PRODUCT id="202003010004">
                <CODE>A004</CODE>
                <DESCRIPTION>Caramel Flavored Syrup</DESCRIPTION>
                <PRICE>9.0</PRICE>
            </PRODUCT>
            <QUANTITY>2</QUANTITY>
        </ORDERITEM>
        <ORDERITEM>
            <PRODUCT id="202003010005">
                <CODE>A006</CODE>
                <DESCRIPTION>Gourmet Coffee Travel Thermo</DESCRIPTION>
                <PRICE>18.0</PRICE>
            </PRODUCT>
            <QUANTITY>3</QUANTITY>
        </ORDERITEM>
    </ORDER>
    <ORDER>
        <ORDERITEM>
            <PRODUCT id="202003010006">
                <CODE>A009</CODE>
                <DESCRIPTION>Gourmet Coffee 36 Cup Filters</DESCRIPTION>
                <PRICE>45.0</PRICE>
            </PRODUCT>
            <QUANTITY>100</QUANTITY>
        </ORDERITEM>
    </ORDER>
</SALES>

上面的 id 属性仅仅是一个标识符,用于标识不同的便签。它并不是便签数据的组成部分,所以不会有害,是XML属性的有益使用。

相关文章
|
27天前
|
XML 存储 数据库
XML的使用教程
XML的使用教程
|
3月前
|
XML 存储 数据格式
xml简介
xml简介
9 0
|
7月前
|
XML 安全 数据格式
XML基础入门:关于XML解析
XML基础入门:关于XML解析
36 0
|
7月前
|
XML 存储 JavaScript
XML入门一
XML入门一
53 0
|
7月前
|
XML 数据格式
XML入门二
XML入门二
43 0
|
7月前
|
XML 存储 缓存
XML入门三
XML入门三
44 0
|
9月前
|
XML 存储 数据格式
|
XML 数据格式
XML 简介(下)
XML 简介(下)
XML 简介(下)
|
XML 数据处理 数据格式
【XML编程与WEB服务】XML入门
【XML编程与WEB服务】XML入门
103 0
|
XML 存储 JSON
XML 教程(一文彻底搞懂XML)
只有启航 才会到达理想的目的地
1183 0
XML 教程(一文彻底搞懂XML)

相关课程

更多