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