Golang XML解组值覆盖问题 ATVPDKIKX0DER 0547569653 2. 美元 9.95 美元 9.95 美元 0 113 72 41 图书在网站上显示 48661 4209 31 6511974011 65 16587 93

Golang XML解组值覆盖问题 ATVPDKIKX0DER 0547569653 2. 美元 9.95 美元 9.95 美元 0 113 72 41 图书在网站上显示 48661 4209 31 6511974011 65 16587 93,xml,go,Xml,Go,仅当ProductCategoryId等于“book_display_on_on_website”时,我才尝试检索“Rank”字段,但是,在我当前的尝试中,它似乎将其Rank设置为最后一个SalesRank条目(93)(应该是(48661))。有人能给我指出正确的方向吗 使用此解组方法是否可能实现这一点?还是需要go-pkg xmlx或gokogiri之类的东西?(我来自php,通常在php上使用简单的xml解析器来处理这类内容。) 类型数据结构{ XMLName xml.Name`xml:“G

仅当ProductCategoryId等于“book_display_on_on_website”时,我才尝试检索“Rank”字段,但是,在我当前的尝试中,它似乎将其Rank设置为最后一个SalesRank条目(93)(应该是(48661))。有人能给我指出正确的方向吗

使用此解组方法是否可能实现这一点?还是需要go-pkg xmlx或gokogiri之类的东西?(我来自php,通常在php上使用简单的xml解析器来处理这类内容。)

类型数据结构{
XMLName xml.Name`xml:“GetCompetitivePricingForASINResponse”`
Item[]Item`xml:“GetCompetitivePricingForASINResult”`
}
类型项结构{
Pcat字符串`xml:“产品>销售排名>销售排名>产品类别ID”`
ASIN string`xml:“ASIN,attr”`
排名字符串`xml:“产品>销售排名>销售排名>排名”`
}
结果,err:=api.GetCompetitivePricingForASIN(asins)
如果(错误!=nil){
fmt.Println(错误)
}
数据:=&数据{}
xml.Unmarshal([]字节(结果),数据)
如果出错!=零{
log.Fatal(错误)
}
对于i:=0;i
返回一个
错误
,您不存储也不检查该错误:

type Data struct {
XMLName xml.Name `xml:"GetCompetitivePricingForASINResponse"`
Item   []Item  `xml:"GetCompetitivePricingForASINResult"`
}

type Item struct {
Pcat string `xml:"Product>SalesRankings>SalesRank>ProductCategoryId"`
ASIN string `xml:"ASIN,attr"`
Rank string `xml:"Product>SalesRankings>SalesRank>Rank"`
}


    result, err := api.GetCompetitivePricingForASIN(asins)

    if (err != nil) {
        fmt.Println(err)
    }

    data := &Data{}

    xml.Unmarshal([]byte(result), data)
    if err != nil {
        log.Fatal(err)
    }

    for i := 0; i < len(data.Item); i++ {
        fmt.Printf("%s\n", data.Item[i])
    }
因此,您在下一行测试的
err
不是
xml.Unmarshal()
的结果,而是先前由
api.GetCompetitivePricingForASIN(asins)
返回的相同值

如果修改它以正确存储
解组()的结果

您将得到以下错误(已包装):

使用此模型,可以按如下方式打印结果:

type Data struct {
    ASIN       string      `xml:"ASIN,attr"`
    SalesRanks []SalesRank `xml:"Product>SalesRankings>SalesRank"`
}

type SalesRank struct {
    Pcat string `xml:"ProductCategoryId"`
    Rank string `xml:"Rank"`
}
输出:

for _, item := range data.SalesRanks {
    fmt.Printf("Cat: %s; Rank: %s\n", item.Pcat, item.Rank)
}
在计算机上尝试完整的程序

下面是一个更简单、信息更丰富的打印:

Cat: book_display_on_website; Rank: 48661
Cat: 4209; Rank: 31
Cat: 6511974011; Rank: 65
Cat: 16587; Rank: 93
输出(已包装):


非常感谢你!你的例子很好用。天哪,我仍然感到困惑,因为我只提供了过多的xml。我试图解析的xml本质上是我上面示例的倍数,在父容器中背靠背。所以我需要创建第三个结构和父循环来处理这个问题?对的我在试图找出正确的语法时有点困惑。要重新表述上述问题,它如何处理xml中的多个结果?示例xml:@PaulR。我的解决方案中当前的
数据
类型表示一个
标记。因此,如果你有更多的数据,在xml和Go代码中都在它周围放置一个包装器。我觉得自己真的很笨,因为我一辈子都无法弄清楚这一点:(@PaulR.E.例如,类似这样的东西:
键入DataWrapper struct{Data[]Data`xml:“GetCompetitivePricingForASINResult”`}
和xml:
expected element type <GetCompetitivePricingForASINResponse> but have
<GetCompetitivePricingForASINResult>
type Data struct {
    ASIN       string      `xml:"ASIN,attr"`
    SalesRanks []SalesRank `xml:"Product>SalesRankings>SalesRank"`
}

type SalesRank struct {
    Pcat string `xml:"ProductCategoryId"`
    Rank string `xml:"Rank"`
}
for _, item := range data.SalesRanks {
    fmt.Printf("Cat: %s; Rank: %s\n", item.Pcat, item.Rank)
}
Cat: book_display_on_website; Rank: 48661
Cat: 4209; Rank: 31
Cat: 6511974011; Rank: 65
Cat: 16587; Rank: 93
fmt.Printf("%+v", data)
&{ASIN:0547569653 SalesRanks:[{Pcat:book_display_on_website Rank:48661}
  {Pcat:4209 Rank:31} {Pcat:6511974011 Rank:65} {Pcat:16587 Rank:93}]}