XML是什么,XML的语法格式(附带实例)
可扩展标记语言(Extensible Markup Language,XML)是一种标记语言,主要用于计算机之间的处理信息,具有良好的扩展性和严谨的语法。
通过标记语言的形式,XML 定义了数据的结构和内容,使数据在不同的系统之间能够被准确地传输和解析。XML 注重数据的存储与传输,被广泛用于承载 Web 服务的数据、配置文件、文档格式等场景。
例如,基于 Java 的 Web 工程常使用 XML 来做配置文件,早期的很多 HTTP 接口都以 XML 作为数据格式的标准。在网络运维自动化领域,XML 用于承载 NETCONF 协议的指令和数据。
元素是构建 XML 文档的基本单位,它由标签和标签包裹的内容或者子元素组成。
标签定义了元素的开始和结束,分为开始标签和结束标签,二者由尖括号包裹,开始标签与结束标签之间是元素的名称。结束标签比开始标签多一个斜杠,例如 <device> 和 </device> 是一组开始标签和结束标签。
在元素的标签之间包裹了元素的信息内容,这些信息内容可以是普通文本,也可以是另一个子元素。一个简单的 XML 元素如下所示,其标签包裹的是文本内容。
标签中包裹的内容可以是若干子元素,类似于 Python 字典的嵌套。包含若干子元素的 XML 元素如下所示。
XML 的属性用于提供有关元素的额外信息,它们被记录在标签中。属性通常包含属性名称和属性值,它们之间用等号连接,属性值要在双引号中,多个属性之间要用空格隔开。在标签中添加属性,示例代码如下所示:
在网络运维自动化领域,XML 报文头部多会添加序言(prolog),用于声明文档的版本和编码方式。XML 文档头部添加声明版本和编码方式的序言,代码如下所示:
有列表数据的 XML 文档如下所示:
上述代码中的列表成员都是单一的元素,也可以是复杂的对象元素,只要复杂对象的标签是统一的即可。有复杂对象列表数据的 XML 文档如下所示,它定义了一个网络设备对象的列表。
用户可以通过统一资源标识符(uniform resource identifier,URI)定义命名空间,在指定元素的标签中定义一个 xmlns 属性即可。
例如,使用 xmlns 标签声明命名空间:
命名空间还可以定义别名,以便在其他元素标签中被引用。别名写在 xmlns 属性之后,用冒号隔开。引用别名时将别名写到标签名称之前,并用英文冒号隔开。
使用 xmlns 标签声明命名空间的另一种方法如下所示:
通过标记语言的形式,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>