gpt4 book ai didi

xml - Golang 将结构索引更改为定义值

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

见下面的代码:

打印出 v.Src[0] 和 v.Src[1] 调出“MySource”和“MySource2”。

但是比较 XML,条目 [0] 和 [1] 不遵循 <id>x</id> 中设置的 ID

我怎样才能实现解码器正在使用 <id>x</id>作为索引?

目标:v.Src[1] 打印“MySource”

这是我的工作代码

主要包

import (

"encoding/xml"
"fmt"
)

type Flow struct {
Id string `xml:"id"`
Name string `xml:"name"`
}
type Src struct {
Id string `xml:"id"`
Name string `xml:"name"`
Flows []Flow `xml:"flows>flow"`
}
type Result struct {
Src []Src `xml:"bar>sources>source"`


}

func main() {
data := `
<foo>
<bar>
<sources>
<source>
<id>1</id>
<name>MySource</name>

<flows>
<flow>
<id>1</id>
<name>MySource 1L</name>
</flow>
<flow>
<id>2</id>
<name>MySource 1R</name>
</flow>
</flows>
</source>
<source>
<id>2</id>
<name>MySource2</name>

<flows>
<flow>
<id>1</id>
<name>MySource2 2L</name>
</flow>
<flow>
<id>2</id>
<name>MySource2 2R</name>
</flow>
</flows>
</source>
</sources>
</bar>
</foo>`

v := Result{}

err := xml.Unmarshal([]byte(data), &v)
if err != nil {
fmt.Printf("error: %v", err)
return
}
fmt.Printf("%#v", v)
fmt.Printf("%#v", v.Src[0].Name) //Prints: "MySource"
fmt.Printf("%#v", v.Src[1].Name) //Prints: "MySource2"
}

非常感谢所有帮助!

最佳答案

因为 v.Src 是一个带有 Src 的 slice ,它的索引只显示元素的顺序而不是它们的内部字段。如何解决任务:

  1. 用指向元素的指针制作特殊 map

    srcs := make(map[int64]*Src)

    for index, src := range v.Src {
    id, _ := strconv.ParseInt(src.Id, 10, 64)
    srcs[id] = &(v.Src[index])
    }

    fmt.Printf("Srcs: %v\n", srcs)
    fmt.Printf("%#v\n", srcs[1].Name) //Prints: "MySource"
    fmt.Printf("%#v\n", srcs[2].Name) //Prints: "MySource2"

    https://play.golang.org/p/6y3uW2jV13

  2. 使用 XPath 访问具有特定属性的元素,然后选择像 //source[./id=1]/name

关于xml - Golang 将结构索引更改为定义值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46155977/

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