XML(Extensible Markup Language)是可扩展标记语言,用来传输和存储数据。因为其允许用户自定义标记名称,具有自我描述性,可灵活地用于存储服务配置信息。
1.语法
XML 文档结构是一种树结构,它从“根部”开始,然后扩展到“枝叶”。XML 文档必须有一个唯一的根结点,根结点包含所有其它结点。所有结点均可拥有文本内容和属性(名称/值的对)。XML 结点也叫做 XML 元素。
编写 XML 文档时,还需要注意以下几点: (1)所有 XML 元素都须有关闭标签; (2)XML 标签对大小写敏感; (3)XML 的属性值须加引号; (4)XML 中的特殊字符可以使用实体引用来表示。在 XML 中,有 5 个预定义的实体引用:
实体引用 | 字符 | 名称 |
---|---|---|
< | < | 小于 |
> | > | 大于 |
& | & | 和号 |
' | ’ | 单引号 |
" | " | 引号 |
(5)在 XML 中编写注释的语法与 HTML 的语法很相似:
代码语言:javascript复制<!-- This is a comment -->
(6)XML 元素必须遵循以下命名规则:
- 名称可以含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字符串 xml(或者 XML、Xml)开始
- 名称不能包含空格
- 名称不能使用保留的字词
2.实例
下面以 XML 表示一个简单的后台服务配置:
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<server name="UserProfileServer">
<maxconns>1000</maxconns>
<queuecap>10000</queuecap>
<queuetimeout>300</queuetimeout>
<loginfo>
<loglevel>ERROR</loglevel>
<logsize>10M</logsize>
<lognum>10</lognum>
<logpath>/usr/local/app/log</logpath>
</loginfo>
</server>
第一行是 XML 声明,它定义 XML 的版本(1.0)和所使用的编码(UTF-8)。紧接着 server 为根结点,name 为根结点的一个属性,表示服务名称,其他子结点的文本内容表示服务的具体配置项。
3.解析
使用 XML 存储服务配置信息,我们如何解析呢?下面以 Go 为例,来解析上面的 XML 格式的服务配置。
第一步,将上面的 XML 配置信息粘贴到 XML to Go struct 快速获取 Go struct 的定义。
代码语言:javascript复制type Server struct {
Name string `xml:"name,attr"` //标签属性
Maxconns string `xml:"maxconns"`
Queuecap string `xml:"queuecap"`
Queuetimeout string `xml:"queuetimeout"`
Loginfo struct {
Loglevel string `xml:"loglevel"`
Logsize string `xml:"logsize"`
Lognum string `xml:"lognum"`
Logpath string `xml:"logpath"`
} `xml:"loginfo"`
}
第二步,借助 Go 自带的 encoding/xml 包完成 XML 文档解析。
代码语言:javascript复制package main
import(
"encoding/xml"
"io/ioutil"
"fmt"
"os"
)
func main() {
file, err := os.Open("server.xml")
if err != nil {
fmt.Printf("error:%vn", err)
return
}
defer file.Close()
data, err := ioutil.ReadAll(file)
if err != nil {
fmt.Printf("error: %v", err)
return
}
v := Server{}
err = xml.Unmarshal(data, &v)
if err != nil {
fmt.Printf("error:%vn", err)
return
}
fmt.Printf("% vn", v)
}
运行输出:
代码语言:javascript复制{Name:UserProfileServer Maxconns:1000 Queuecap:10000 Queuetimeout:300 Loginfo:{Loglevel:ERROR Logsize:10M Lognum:10 Logpath:/usr/local/app/log}}
参考文献
XML 简介 - XML:可扩展标记语言 | MDN Go Package xml XML to Go struct Online Tool