gpt4 book ai didi

xml-parsing - 使用 (xpath) 条件解码 XML

转载 作者:数据小太阳 更新时间:2023-10-29 03:28:52 26 4
gpt4 key购买 nike

我正在尝试解码一些结构类似于以下示例的 XML:

<player>
<stat type="first_name">Somebody</stat>
<stat type="last_name">Something</stat>
<stat type="birthday">06-12-1987</stat>
</player>

将其解码为类似这样的结构非常容易

type Player struct {
Stats []Stat `xml:"stat"`
}

但我正在寻找一种方法将其解码为更像的结构

type Player struct {
FirstName string `xml:"stat[@Type='first_name']"`
LastName string `xml:"stat[@Type='last_name']"`
Birthday Time `xml:"stat[@Type='birthday']"`
}

有什么办法可以用标准的编码/xml 包做到这一点吗?如果没有,你能给我一个提示,如何在 go 中分解这样的“问题”吗? (基本上是针对此类任务的围棋软件架构的最佳实践)。

谢谢!

最佳答案

encoding/xml 包没有实现 xpath,但是有一组简单的选择方法可供使用。

这是一个示例,说明如何使用 encoding/xml 解码 XML。因为统计数据都是同一类型,具有相同的属性,所以解码它们的最简单方法是将其放入同一类型的 slice 中。 http://play.golang.org/p/My10GFiWDa

var doc = []byte(`<player>
<stat type="first_name">Somebody</stat>
<stat type="last_name">Something</stat>
<stat type="birthday">06-12-1987</stat>
</player>`)

type Player struct {
XMLName xml.Name `xml:"player"`
Stats []PlayerStat `xml:"stat"`
}

type PlayerStat struct {
Type string `xml:"type,attr"`
Value string `xml:",chardata"`
}

如果它是您需要经常转换的东西,您可以使用 UnamrshalXML 方法进行转换:http://play.golang.org/p/htoOSa81Cn

type Player struct {
XMLName xml.Name `xml:"player"`
FirstName string
LastName string
Birthday string
}

func (p *Player) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
for {
t, err := d.Token()
if err == io.EOF {
break
} else if err != nil {
return err
}

if se, ok := t.(xml.StartElement); ok {

t, err = d.Token()
if err != nil {
return err
}

var val string
if c, ok := t.(xml.CharData); ok {
val = string(c)
} else {
// not char data, skip for now
continue
}

// assuming we have exactly one Attr
switch se.Attr[0].Value {
case "first_name":
p.FirstName = val
case "last_name":
p.LastName = val
case "birthday":
p.Birthday = val
}
}
}
return nil
}

关于xml-parsing - 使用 (xpath) 条件解码 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27534773/

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