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)
	}
}

注意事项

  1. xml2map将所有的XML元素值都转换为字符串类型,数字需要手动转换
  2. 对于复杂的XML结构,类型断言时需要小心处理
  3. 如果XML中有CDATA部分,它们会被当作普通文本处理

替代方案

如果你需要更多功能,也可以考虑以下替代方案:

  • encoding/xml标准库(更灵活但更复杂)
  • github.com/beevik/etree(提供类似DOM的接口)
  • github.com/antchfx/xmlquery(类似jQuery的XML处理)

xml2map的优势在于它的简单性和直接将XML转换为map结构的能力,非常适合配置文件和简单数据交换场景。

回到顶部