golang XML转MAP数据转换插件库xml2map的使用
Golang XML转MAP数据转换插件库xml2map的使用
xml2map是一个用Golang编写的XML到MAP转换器,可以将XML数据转换为map[string]interface{}格式。
功能特点
- 将XML转换为map[string]interface{}格式
- 支持属性前缀和文本前缀的自定义设置
- 可用于模板生成等场景
安装
使用go get安装:
go get -u github.com/sbabiv/xml2map
或者使用dep:
dep ensure -add github.com/sbabiv/xml2map
使用示例
func main() {
// XML数据示例
data := `<container uid="FA6666D9-EC9F-4DA3-9C3D-4B2460A4E1F6" lifetime="2019-10-10T18:00:11">
<cats>
<cat>
<id>CDA035B6-D453-4A17-B090-84295AE2DEC5</id>
<name>moritz</name>
<age>7</age>
<items>
<n>1293</n>
<n>1255</n>
<n>1257</n>
</items>
</cat>
<cat>
<id>1634C644-975F-4302-8336-1EF1366EC6A4</id>
<name>oliver</name>
<age>12</age>
</cat>
<dog color="gray">hello</dog>
</cats>
<color>white</color>
<city>NY</city>
</container>`
// 创建解码器并解码XML
decoder := xml2map.NewDecoder(strings.NewReader(data))
result, err := decoder.Decode()
if err != nil {
fmt.Printf("%v\n", err)
} else {
fmt.Printf("%v\n", result)
}
// 访问转换后的数据
v := result["container"].
(map[string]interface{})["cats"].
(map[string]interface{})["cat"].
([]map[string]interface{})[0]["items"].
(map[string]interface{})["n"].([]string)[1]
fmt.Printf("n[1]: %v\n", v)
}
自定义前缀
如果想使用自定义前缀,可以使用NewDecoderWithPrefix
方法:
NewDecoderWithPrefix(reader io.Reader, attrPrefix, textPrefix string) *Decoder
输出示例
map[container:map[@uid:FA6666D9-EC9F-4DA3-9C3D-4B2460A4E1F6 @lifetime:2019-10-10T18:00:11 cats:map[cat:[map[id:CDA035B6-D453-4A17-B090-84295AE2DEC5 name:moritz age:7 items:map[n:[1293 1255 1257]]] map[id:1634C644-975F-4302-8336-1EF1366EC6A4 name:oliver age:12]] dog:map[@color:gray #text:hello]] color:white city:NY]]
result: 1255
性能基准测试
$ go test -bench=. -benchmem
goos: darwin
goarch: amd64
pkg: github.com/sbabiv/xml2map
BenchmarkDecoder-8 50000 29773 ns/op 15032 B/op 261 allocs/op
PASS
ok github.com/sbabiv/xml2map 1.805s
许可证
MIT许可证
作者
Babiv Sergey
更多关于golang XML转MAP数据转换插件库xml2map的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang XML转MAP数据转换插件库xml2map的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang XML转MAP数据转换插件库xml2map的使用
xml2map是一个简单易用的Golang库,用于将XML数据转换为Map结构。下面我将详细介绍如何使用这个库。
安装
首先,你需要安装xml2map库:
go get github.com/clbanning/xml2map
基本使用
1. 简单XML转Map
package main
import (
"fmt"
"log"
"github.com/clbanning/xml2map"
)
func main() {
xmlData := `
<person>
<name>John Doe</name>
<age>30</age>
<address>
<street>123 Main St</street>
<city>New York</city>
</address>
</person>
`
// 创建解码器
decoder := xml2map.NewDecoder(strings.NewReader(xmlData))
// 解码XML到map
result, err := decoder.Decode()
if err != nil {
log.Fatal(err)
}
fmt.Printf("%#v\n", result)
}
输出结果将是一个嵌套的map结构,类似于:
map[string]interface{}{
"person": map[string]interface{}{
"name": "John Doe",
"age": "30",
"address": map[string]interface{}{
"street": "123 Main St",
"city": "New York",
},
},
}
2. 处理XML属性
xml2map也能处理XML属性:
xmlData := `
<book id="123">
<title>Golang Programming</title>
<author>Jane Smith</author>
</book>
`
decoder := xml2map.NewDecoder(strings.NewReader(xmlData))
result, err := decoder.Decode()
if err != nil {
log.Fatal(err)
}
fmt.Printf("%#v\n", result)
输出结果将包含属性:
map[string]interface{}{
"book": map[string]interface{}{
"-id": "123", // 属性以-为前缀
"title": "Golang Programming",
"author": "Jane Smith",
},
}
3. 处理数组/列表
当XML中有多个同名元素时,它们会被转换为数组:
xmlData := `
<books>
<book>
<title>Book 1</title>
</book>
<book>
<title>Book 2</title>
</book>
</books>
`
decoder := xml2map.NewDecoder(strings.NewReader(xmlData))
result, err := decoder.Decode()
if err != nil {
log.Fatal(err)
}
fmt.Printf("%#v\n", result)
输出结果:
map[string]interface{}{
"books": map[string]interface{}{
"book": []interface{}{
map[string]interface{}{"title": "Book 1"},
map[string]interface{}{"title": "Book 2"},
},
},
}
高级配置
xml2map提供了一些配置选项:
1. 自定义属性前缀
默认情况下,属性以"-"为前缀,你可以修改这个前缀:
decoder := xml2map.NewDecoder(strings.NewReader(xmlData))
decoder.AttrPrefix = "@" // 改为使用@作为属性前缀
result, err := decoder.Decode()
2. 处理命名空间
xmlData := `
<ns:person xmlns:ns="http://example.com">
<ns:name>John</ns:name>
</ns:person>
`
decoder := xml2map.NewDecoder(strings.NewReader(xmlData))
decoder.PrefixMatch = true // 保留命名空间前缀
result, err := decoder.Decode()
实际应用示例
下面是一个完整的示例,展示如何从文件读取XML并转换为Map:
package main
import (
"fmt"
"log"
"os"
"github.com/clbanning/xml2map"
)
func main() {
// 从文件读取XML
file, err := os.Open("data.xml")
if err != nil {
log.Fatal(err)
}
defer file.Close()
// 创建解码器
decoder := xml2map.NewDecoder(file)
// 解码XML
result, err := decoder.Decode()
if err != nil {
log.Fatal(err)
}
// 访问数据
person := result["person"].(map[string]interface{})
name := person["name"].(string)
age := person["age"].(string)
fmt.Printf("Name: %s, Age: %s\n", name, age)
// 如果有地址信息
if address, ok := person["address"].(map[string]interface{}); ok {
street := address["street"].(string)
city := address["city"].(string)
fmt.Printf("Address: %s, %s\n", street, city)
}
}
注意事项
- xml2map将所有的XML元素值都转换为字符串类型,数字需要手动转换
- 对于复杂的XML结构,类型断言时需要小心处理
- 如果XML中有CDATA部分,它们会被当作普通文本处理
替代方案
如果你需要更多功能,也可以考虑以下替代方案:
encoding/xml
标准库(更灵活但更复杂)github.com/beevik/etree
(提供类似DOM的接口)github.com/antchfx/xmlquery
(类似jQuery的XML处理)
xml2map的优势在于它的简单性和直接将XML转换为map结构的能力,非常适合配置文件和简单数据交换场景。