首页 > 编程笔记 > Python笔记 阅读:25

XML是什么,XML的语法格式(附带实例)

可扩展标记语言(Extensible Markup Language,XML)是一种标记语言,主要用于计算机之间的处理信息,具有良好的扩展性和严谨的语法。

通过标记语言的形式,XML 定义了数据的结构和内容,使数据在不同的系统之间能够被准确地传输和解析。XML 注重数据的存储与传输,被广泛用于承载 Web 服务的数据、配置文件、文档格式等场景。

例如,基于 Java 的 Web 工程常使用 XML 来做配置文件,早期的很多 HTTP 接口都以 XML 作为数据格式的标准。在网络运维自动化领域,XML 用于承载 NETCONF 协议的指令和数据。

XML元素、标签与属性

XML 中有 3 个重要的概念:元素(element)、标签(tag)和属性(attribute)。

元素是构建 XML 文档的基本单位,它由标签和标签包裹的内容或者子元素组成。

标签定义了元素的开始和结束,分为开始标签和结束标签,二者由尖括号包裹,开始标签与结束标签之间是元素的名称。结束标签比开始标签多一个斜杠,例如 <device> 和 </device> 是一组开始标签和结束标签。

在元素的标签之间包裹了元素的信息内容,这些信息内容可以是普通文本,也可以是另一个子元素。一个简单的 XML 元素如下所示,其标签包裹的是文本内容。
<device>netdevops01</device>

标签中包裹的内容可以是若干子元素,类似于 Python 字典的嵌套。包含若干子元素的 XML 元素如下所示。
<device>
    <name>netdevops01</name>
    <ip>192.168.137.1</ip>
    <vendor>华为</vendor>
    <online>true</online>
    <rack>0101</rack>
    <start_u>20</start_u>
    <end_u>21</end_u>
    <uptime>null</uptime>
</device>

XML 的属性用于提供有关元素的额外信息,它们被记录在标签中。属性通常包含属性名称和属性值,它们之间用等号连接,属性值要在双引号中,多个属性之间要用空格隔开。在标签中添加属性,示例代码如下所示:
<device id="001">
    <name>netdevops01</name>
    <ip>192.168.137.1</ip>
    <vendor>华为</vendor>
    <online>true</online>
    <rack>0101</rack>
    <start_u>20</start_u>
    <end_u>21</end_u>
    <uptime>null</uptime>
</device>
在 device 元素的标签中,用 id 属性标记了这台设备的 ID 值。

在网络运维自动化领域,XML 报文头部多会添加序言(prolog),用于声明文档的版本和编码方式。XML 文档头部添加声明版本和编码方式的序言,代码如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<device id="001">
    <name>netdevops01</name>
    <ip>192.168.137.1</ip>
    <vendor>华为</vendor>
    <online>true</online>
    <rack>0101</rack>
    <start_u>20</start_u>
    <end_u>21</end_u>
    <uptime>null</uptime>
</device>
这是一个比较完整的 XML 文档。XML 本身对缩进不敏感。完全可以将上述所有 XML 报文的内容写在一行,但在开发中一般会适当调整 XML 缩进,从而提高文档可读性。

XML列表数据的定义

XML 也支持列表数据的定义,XML 需要先定义一个元素,用于承载列表数据的内容。列表数据的根元素内包含多个标签名一致的元素成员。

有列表数据的 XML 文档如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<interfaces>
    <interface>eth1/1</interface>
    <interface>eth1/2</interface>
    <interface>eth1/3</interface>
</interfaces>
其中使用 XML 定义了端口列表,在 XML 报文中先定义 interfaces 元素,用于承载端口列表的数据,然后定义若干 interface 元素。

上述代码中的列表成员都是单一的元素,也可以是复杂的对象元素,只要复杂对象的标签是统一的即可。有复杂对象列表数据的 XML 文档如下所示,它定义了一个网络设备对象的列表。
<?xml version="1.0" encoding="UTF-8"?>
<devices>
    <device>
        <name>netdevops01</name>
        <ip>192.168.137.1</ip>
    </device>
    <device>
        <name>netdevops02</name>
        <ip>192.168.137.2</ip>
    </device>
    <device>
        <name>netdevops03</name>
        <ip>192.168.137.3</ip>
    </device>
</devices>

XML命名空间

XML 的命名空间(namespace)用于在不同的上下文中区分同名的元素,例如在同一个 XML 文档中有两个不同含义的同名 interfaces 元素,就可以通过给两个 interfaces 元素定义不同的命名空间加以区分。

用户可以通过统一资源标识符(uniform resource identifier,URI)定义命名空间,在指定元素的标签中定义一个 xmlns 属性即可。

例如,使用 xmlns 标签声明命名空间:
<?xml version="1.0" encoding="UTF-8"?>
<device id="001" xmlns="huawei.com">
    <name>netdevops01</name>
    <ip>192.168.137.1</ip>
    <vendor>华为</vendor>
    <online>true</online>
    <rack>0101</rack>
    <start_u>20</start_u>
    <end_u>21</end_u>
    <interface_usage>0.67</interface_usage>
    <interfaces>
        <interface>eth1/1</interface>
        <interface>eth1/2</interface>
        <interface>eth1/3</interface>
    </interfaces>
    <uptime>null</uptime>
</device>

命名空间还可以定义别名,以便在其他元素标签中被引用。别名写在 xmlns 属性之后,用冒号隔开。引用别名时将别名写到标签名称之前,并用英文冒号隔开。

使用 xmlns 标签声明命名空间的另一种方法如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<n:device xmlns:n="huawei.com">
    <n:name>netdevops01</n:name>
    <n:ip>192.168.137.1</n:ip>
</n:device>

相关文章