gpt4 book ai didi

xml - Golang XML Unmarshal 值覆盖问题

转载 作者:IT王子 更新时间:2023-10-29 01:42:46 25 4
gpt4 key购买 nike

<GetCompetitivePricingForASINResult ASIN="0547569653" status="Success">
<Product xmlns:ns2="http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd"
xmlns="http://mws.amazonservices.com/schema/Products/2011-10-01">
<Identifiers>
<MarketplaceASIN>
<MarketplaceId>ATVPDKIKX0DER</MarketplaceId>
<ASIN>0547569653</ASIN>
</MarketplaceASIN>
</Identifiers>
<CompetitivePricing>
<CompetitivePrices>
<CompetitivePrice belongsToRequester="false" condition="Used" subcondition="Good">
<CompetitivePriceId>2</CompetitivePriceId>
<Price>
<LandedPrice>
<CurrencyCode>USD</CurrencyCode>
<Amount>9.95</Amount>
</LandedPrice>
<ListingPrice>
<CurrencyCode>USD</CurrencyCode>
<Amount>9.95</Amount>
</ListingPrice>
<Shipping>
<CurrencyCode>USD</CurrencyCode>
<Amount>0.00</Amount>
</Shipping>
</Price>
</CompetitivePrice>
</CompetitivePrices>
<NumberOfOfferListings>
<OfferListingCount condition="Any">113</OfferListingCount>
<OfferListingCount condition="Used">72</OfferListingCount>
<OfferListingCount condition="New">41</OfferListingCount>
</NumberOfOfferListings>
</CompetitivePricing>
<SalesRankings>
<SalesRank>
<ProductCategoryId>book_display_on_website</ProductCategoryId>
<Rank>48661</Rank>
</SalesRank>
<SalesRank>
<ProductCategoryId>4209</ProductCategoryId>
<Rank>31</Rank>
</SalesRank>
<SalesRank>
<ProductCategoryId>6511974011</ProductCategoryId>
<Rank>65</Rank>
</SalesRank>
<SalesRank>
<ProductCategoryId>16587</ProductCategoryId>
<Rank>93</Rank>
</SalesRank>
</SalesRankings>
</Product>
</GetCompetitivePricingForASINResult>

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

这甚至可以使用这种 Unmarshal 方法吗?还是需要 go-pkg-xmlx 或 gokogiri 之类的东西? (我来自 php,通常在 php 上使用 simple_xml_parser 来处理这种类型的东西。)

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])
}

最佳答案

xml.Unmarshal()返回一个您不存储也不检查的错误:

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

因此,您在下一行中测试的err 不是 xml.Unmarshal() 的结果,但与之前返回的值相同通过 api.GetCompetitivePricingForASIN(asins)

如果您修改它以正确存储 Unmarshal() 的结果:

err = xml.Unmarshal([]byte(result), data)

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

expected element type <GetCompetitivePricingForASINResponse> but have
<GetCompetitivePricingForASINResult>

您的模型没有正确描述 XML 输入。尝试使用以下结构对 XML 进行建模(您要删除的部分):

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

Go Playground 上尝试完整的程序.

这是一个更简单、信息量更大的打印:

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}]}

关于xml - Golang XML Unmarshal 值覆盖问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29324564/

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