Golang基础(xml文件)

一.XML文件简介

  • 英文全称:Extensible Markup Language

  • 中文全称:可扩展标记语言

  • 用途:

    • 数据存储

    • 数据交互

    • 配置文件

  • 优点:

    • 跨平台性

    • 数据工整,易读

二.XML文档结构

  • XML文档结构

    • 第一行:XML头,版本和编码

    • 第二行:DTD可选,能够检查XML内容是否满足要求

    • 最外层标签<peoples> 称为元素节点,根节点

    • <people>...<people> 整个标签称为元素节点

    • id=”1” 属性节点e

    • 标签中文字:文本节点

  • 示例如下

三.语法要求

  • 严格区分大小写

  • 标签必须正确嵌套,必须正确关闭

  • 必须有根节点

  • 属性值必须有双引号

  • 注释:<!-- -->

  • 文本节点出现特殊字符,需要使用实体引用替换

 

四、Go语言标准库提供的API

  • 在encoding/xml包下提供了对XML序列化和反序列化的API

  • 使用Unmarshal可以直接把XML字节切片数据转换为结构体

  • 转换时按照特定的转换规则进行转换,且数据类型可以自动转换

* 如果结构体字段的类型为字符串或者[]byte,且标签为",innerxml",
  Unmarshal函数直接将对应原始XML文本写入该字段,其余规则仍适用。
* 如果结构体字段类型为xml.Name且名为XMLName,Unmarshal会将元素名写入该字段
* 如果字段XMLName的标签的格式为"name"或"namespace-URL name",
  XML元素必须有给定的名字(以及可选的名字空间),否则Unmarshal会返回错误。
* 如果XML元素的属性的名字匹配某个标签",attr"为字段的字段名,或者匹配某个标签为"name,attr"
  的字段的标签名,Unmarshal会将该属性的值写入该字段。
* 如果XML元素包含字符数据,该数据会存入结构体中第一个具有标签",chardata"的字段中,
  该字段可以是字符串类型或者[]byte类型。如果没有这样的字段,字符数据会丢弃。
* 如果XML元素包含注释,该数据会存入结构体中第一个具有标签",comment"的字段中,
  该字段可以是字符串类型或者[]byte类型。如果没有这样的字段,字符数据会丢弃。
* 如果XML元素包含一个子元素,其名称匹配格式为"a"或"a>b>c"的标签的前缀,反序列化会深入
  XML结构中寻找具有指定名称的元素,并将最后端的元素映射到该标签所在的结构体字段。
  以">"开始的标签等价于以字段名开始并紧跟着">" 的标签。
* 如果XML元素包含一个子元素,其名称匹配某个结构体类型字段的XMLName字段的标签名,
  且该结构体字段本身没有显式指定标签名,Unmarshal会将该元素映射到该字段。
* 如果XML元素的包含一个子元素,其名称匹配够格结构体字段的字段名,且该字段没有任何模式选项
  (",attr"、",chardata"等),Unmarshal会将该元素映射到该字段。
* 如果XML元素包含的某个子元素不匹配以上任一条,而存在某个字段其标签为",any",
  Unmarshal会将该元素映射到该字段。
* 匿名字段被处理为其字段好像位于外层结构体中一样。
* 标签为"-"的结构体字段永不会被反序列化填写。

 XML文件读取

  • 给定XML文件内容如下

<?xml version="1.0" encoding="UTF-8" ?>
<people id="888">
    <name>smallming</name>
    <address>北京海淀</address>
</people>
  • 新建结构体,装载XML数据

    • 结构体中属性首字母必须大写,否则无法装配

type People struct {
    XMLName xml.Name `xml:"people"`
    Id      int      `xml:"id,attr"`
    Name    string   `xml:"name"`
    Address string   `xml:"address"`
}
​
func main() {
    peo := new(People)
    b, err := ioutil.ReadFile("demo.xml")
    fmt.Println(string(b))
    fmt.Println("111:", err)
    err = xml.Unmarshal(b, peo)
    fmt.Println("2222", err)
    fmt.Println(peo)
}

三.多层嵌套XML文件读取

  • 给定XML中数据如下

<?xml version="1.0" encoding="UTF-8" ?>
<peoples version="0.9">
    <people id="888">
        <name>smallming</name>
        <address>北京海淀</address>
    </people>
    <people id="998">
        <name>佳明哥</name>
        <address>北京朝阳</address>
    </people>
</peoples>
  • 编写读取XML数据代码

type Peoples struct {
    XMLName xml.Name `xml:"peoples"`
    Version string   `xml:"version,attr"`
    Peos    []People `xml:"people"`
}
​
type People struct {
    XMLName xml.Name `xml:"people"`
    Id      int      `xml:"id,attr"`
    Name    string   `xml:"name"`
    Address string   `xml:"address"`
}
​
func main() {
    peo := new(Peoples)
    b, err := ioutil.ReadFile("demo.xml")
    fmt.Println(string(b))
    fmt.Println("111:", err)
    err = xml.Unmarshal(b, peo)
    fmt.Println("2222", err)
    fmt.Println(peo)
}

生成XML

  • 生成XML只要在学习下encoding/xml包下的Marshal()函数,结合输入流就可以完成xml文件生成

  • 在encoding/xml中有常量,常量中是xml文档头

const (
    // Header is a generic XML header suitable for use with the output of Marshal.
    // This is not automatically added to any output of this package,
    // it is provided as a convenience.
    Header = `<?xml version="1.0" encoding="UTF-8"?>` + "\n"
)

代码示例

  • 使用Marshal()函数生成的[]byte没有格式化

  • 使用MarshalIndent()可以对内容进行格式化

    • 第一个参数:结构体对象

    • 第二个参数:每行的前缀

    • 第三个参数:层级缩进内容

type People struct {
    XMLName xml.Name `xml:"people"`
    Id      int      `xml:"id,attr"`
    Name    string   `xml:"name"`
    Address string   `xml:"address"`
}
​
func main() {
    peo := People{Id: 123, Name: "smallming", Address: "北京海淀"}
    b, _ := xml.MarshalIndent(peo, "", "    ")
    b = append([]byte(xml.Header), b...)
    ioutil.WriteFile("D:/peo.xml", b, 0666)
    fmt.Println("程序结束")
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 Go 标准库中的 `encoding/xml` 和 `html/template` 包来实现将 XML 转换为 HTML 的功能。 首先,你需要定义一个结构体来存放 XML 数据,例如: ```go type Person struct { XMLName xml.Name `xml:"person"` Name string `xml:"name"` Age int `xml:"age"` } ``` 这个结构体对应一个 XML 格式的数据: ```xml <person> <name>John</name> <age>30</age> </person> ``` 接下来,你可以使用 `encoding/xml` 包中的 `Unmarshal` 函数将 XML 数据解析为结构体: ```go data := []byte(` <person> <name>John</name> <age>30</age> </person> `) var person Person err := xml.Unmarshal(data, &person) if err != nil { panic(err) } ``` 此时,`person` 变量就包含了 XML 数据的内容。 最后,你可以使用 `html/template` 包中的模板引擎来生成 HTML 代码: ```go templateStr := ` <html> <head> <title>{{.Name}}'s page</title> </head> <body> <h1>{{.Name}}</h1> <p>Age: {{.Age}}</p> </body> </html> ` t, err := template.New("webpage").Parse(templateStr) if err != nil { panic(err) } var buf bytes.Buffer err = t.Execute(&buf, person) if err != nil { panic(err) } htmlCode := buf.String() fmt.Println(htmlCode) ``` 在这个例子中,我们使用了一个简单的模板,将 XML 数据转换为 HTML 页面。`{{.Name}}` 和 `{{.Age}}` 是模板中的占位符,它们会被实际的数据替换掉。 完整的示例代码如下: ```go package main import ( "bytes" "encoding/xml" "fmt" "html/template" ) type Person struct { XMLName xml.Name `xml:"person"` Name string `xml:"name"` Age int `xml:"age"` } func main() { data := []byte(` <person> <name>John</name> <age>30</age> </person> `) var person Person err := xml.Unmarshal(data, &person) if err != nil { panic(err) } templateStr := ` <html> <head> <title>{{.Name}}'s page</title> </head> <body> <h1>{{.Name}}</h1> <p>Age: {{.Age}}</p> </body> </html> ` t, err := template.New("webpage").Parse(templateStr) if err != nil { panic(err) } var buf bytes.Buffer err = t.Execute(&buf, person) if err != nil { panic(err) } htmlCode := buf.String() fmt.Println(htmlCode) } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值