gpt4 book ai didi

带有golang属性的xml文档

转载 作者:IT王子 更新时间:2023-10-29 02:03:44 24 4
gpt4 key购买 nike

我有一个看起来像这样的 XML 文档

<?xml version="1.0"?>
<!DOCTYPE venue SYSTEM "z.dtd">
<venue>
<c>
<a n="k1"><i>0</i></a>
<a n="k2"><b v="f"/></a>
</c>
</venue>

我想提取 k1 (integer) , 0 和 k2 (bool) , false

我如何使用“encoding/xml”做到这一点?

最佳答案

您必须使用 Go 结构为您的 XML 结构建模。

对于可能具有不同内容的元素(子元素),一种选择是列出所有可能的变化,并且只有遇到的元素才会被解码。

您的 XML 结构可以像这样建模:

type Venue struct {
As []A `xml:"c>a"`
}

type A struct {
N string `xml:"n,attr"`
I I `xml:"i"`
B B `xml:"b"`
}

type I struct {
I int `xml:",chardata"`
}

type B struct {
V bool `xml:"v,attr"`
}

以及解码 XML 文档的代码:

func main() {
var v Venue
err := xml.Unmarshal([]byte(data), &v)
fmt.Printf("%+v %v", v, err)
}

const data = `<?xml version="1.0"?>
<!DOCTYPE venue SYSTEM "z.dtd">
<venue>
<c>
<a n="k1"><i>1</i></a>
<a n="k2"><b v="f"/></a>
</c>
</venue>`

输出(在 Go Playground 上尝试):

{As:[{N:k1 I:{I:1} B:{V:false}} {N:k2 I:{I:0} B:{V:false}}]} <nil>

如您所见,Venue.As slice 的第一个元素有 A.N=k1,它有 A.I.I=1取自 XML 的值。

Venue.As slice 的第二个元素有 A.N=k2,它有 A.B.V=false 值,取自XML。

如果“包装器”A 结构包含 IB 字段(即使只有其中一个)让您感到困扰包含有效数据),您可以将它们声明为指针,而 XML 中不存在的将是 nil(使其明显且易于分辨 XML 中存在的元素):

type A struct {
N string `xml:"n,attr"`
I *I `xml:"i"`
B *B `xml:"b"`
}

这次输出(在 Go Playground 上试试):

{As:[{N:k1 I:0x1050e24c B:<nil>} {N:k2 I:<nil> B:0x1050e2f5}]} <nil>

关于带有golang属性的xml文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41144058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com