相比起 Json,XML 是一种相对古老和复杂、但功能更加强大的数据存储/传输格式。也因为其复杂,有一些语法需要记录一下,在使用多种语言进行 XML 操作的时候备查。
下面是一个相对比较完整的 XML 范例:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 上面这一行不属于 XML 组成部分,但是是 XML 文档的一部分 -->
<readme>
<author>Andrew</author>
<date>
2018-10-11
<year>2018</year>
<mon>10</mon>
<mday>11</mday>
</date>
<note>这是一个示例性质的 XML 范例。可以看到,一些关键字符比如双引号 " 是需要转义的。</note>
<main_page id="1307425">
<href><![CDATA[https://cloud.tencent.com/developer/column/4101]]></href>
<name>amc</name>
</main_page>
</readme>
以下内容主要根据上述范例进行说明。
名词 | 英文名 | 说明 |
---|---|---|
XML | XML | 可扩展标记语言(EXtensible Markup Language) |
XML 文档 | Document | 上述范例就是一个 XML 文档 |
元素 | Element | 一个 |
XML 标签 | Tags | 范例中的 |
根元素 | Root | 每个 XML 文档需要有且只有一个根元素,这个元素是所有元素的祖先元素 |
子元素 | Children | 同胞元素(Siblings):范例中 |
文本内容 | Text | 范例中, |
属性 | Attributes | 范例中 |
<name>
均必须跟着一个 </name>
结尾强制性的命名规则如下:
约定俗成(建议)的命名规则,除了上述几条之外,还有:
-
”,建议使用下划线 “_
”.
” 和冒号 “:
”ascii
字符建议避免使用属性,而是以子元素 + 文本内容的方式来替代。比如:
<date>2018-10-11</date>
建议替换成范例中的:
<date>
2018-10-11<!--可加可不加,加上可以作为对老代码的兼容-->
<year>2018</year>
<mon>10</mon>
<mday>11</mday>
</date>
这里借用了 C/C++ 里格式化字符串的 “转义” 一词,但是实际上 XML 没有这个名词,而是 “实体引用”。XML 中有五个预定义的实体引用,在使用的时候需要 “转义”:
字符名 | 字符 | “转义” 后的字符串 |
---|---|---|
小于号 |
|
|
大于号 |
|
|
”and“ 符号 |
|
|
单引号 |
|
|
双引号 |
|
|
其中只有 <
和 &
是确实需要特殊处理的,但是作为规范,上述所有符号实际操作中均应处理。
XML CDATA
是一个关键字,其包含的内容不会被 XML 解析器解析。CDATA 采用 <![CDATA
开头,用 ]]>
结尾。比如范例中的:
<href><![CDATA[https://cloud.tencent.com/developer/column/4101]]></href>
注意不同语言或库对 CDATA 的解析方式可能会有所不同,比如 Python 解析 CDATA 后会得到一个普通的 text 值,但是 RapidXML 则会得到一个子元素。
CDATA 也有限制,就是正文中不能包含 ]]>
,否则会导致解析错误。
这个功能目前笔者觉得比较少用,不过还是记录一下。命名空间约定使用冒号进行分分隔。命名空间可以手动指定,如:
<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
实操中,推荐加上命名空间属性 xmlns
,如:
<f:table xmlns:f="http://www.w3school.com.cn/furniture">
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
本文章采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
原文发布于:https://cloud.tencent.com/developer/article/1351914。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。