我怎样才能提取亚马逊MWS XML文件中的值如下所示?
可悲的是,我不是很好用PHP(或XML)。 我一直在读/乱投医我能找到的所有的网站,我可以找到,但我想我只是不胜任工作。
我试过DOM,SimpleXML的,命名空间等等等等,但一定是简单地完全搞错了。
我试过这个代码片段:
$response = $service->GetMyPriceForASIN($request);
$dom = new DOMDocument();
$dom->loadXML($response->toXML());
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->saveXML();
$x = $dom->documentElement;
foreach ($x->childNodes AS $item) {
print $item->nodeName . " = " . $item->nodeValue . "<br>";
}
然而它只返回从最外层的节点,这里显示这样的数据:
GetMyPriceForASINResult = xxxxxxxxxxxB07DNYLZP5USD9.97USD9.97USD0.00USD15.99AMAZONNewNewxxxxxxxxxxxxxDazzle纹身ResponseMetadata = xxxxxxxxxxxxxxxxxxxxxxxx
什么我只是试图让是货币价格即是[优惠]节点下的孩子。
<?xml version="1.0"?>
<GetMyPriceForASINResponse
xmlns="http://mws.amazonservices.com/schema/Products/2011-10-01">
<GetMyPriceForASINResult ASIN="B07DNYLZP5" status="Success">
<Product>
<Identifiers>
<MarketplaceASIN>
<MarketplaceId>xxxxxxxxxxxxxxxxxx</MarketplaceId>
<ASIN>B07DNYLZP5</ASIN>
</MarketplaceASIN>
</Identifiers>
<Offers>
<Offer>
<BuyingPrice>
<LandedPrice>
<CurrencyCode>USD</CurrencyCode>
<Amount>9.97</Amount>
</LandedPrice>
<ListingPrice>
<CurrencyCode>USD</CurrencyCode>
<Amount>9.97</Amount>
</ListingPrice>
<Shipping>
<CurrencyCode>USD</CurrencyCode>
<Amount>0.00</Amount>
</Shipping>
</BuyingPrice>
<RegularPrice>
<CurrencyCode>USD</CurrencyCode>
<Amount>15.99</Amount>
</RegularPrice>
<FulfillmentChannel>AMAZON</FulfillmentChannel>
<ItemCondition>New</ItemCondition>
<ItemSubCondition>New</ItemSubCondition>
<SellerId>xxxxxxxxxx</SellerId>
<SellerSKU>Dazzle Tattoos</SellerSKU>
</Offer>
</Offers>
</Product>
</GetMyPriceForASINResult>
<ResponseMetadata>
<RequestId>xxxxxxxxxxxxxxxxxxxxx</RequestId>
</ResponseMetadata>
</GetMyPriceForASINResponse>
更新
由奈杰尔提供的链接没有帮助 - 它基本上是一个信息汇编。
XML 一般来说是相当容易的工作,但你绊倒的,使得它更tricker的事情之一:XML命名空间。 这是由存在的送人xmlns
在外部元件的属性。
我在观看你的文档首先想到的是,由于我不熟悉这个API,“报价”听起来像它可能是复数。 因此,我改性测试文档,以允许,由于<Offers>
可能是设计成含有零个,一个或多于一个的<Offer>
。
因此,为了进行测试,这应该是这样的(我刚刚复制的单一<Offer>
为了方便):
<?xml version="1.0"?>
<GetMyPriceForASINResponse
xmlns="http://mws.amazonservices.com/schema/Products/2011-10-01"
>
<GetMyPriceForASINResult ASIN="B07DNYLZP5" status="Success">
<Product>
<Identifiers>
<MarketplaceASIN>
<MarketplaceId>xxxxxxxxxxxxxxxxxx</MarketplaceId>
<ASIN>B07DNYLZP5</ASIN>
</MarketplaceASIN>
</Identifiers>
<Offers>
<Offer>
<BuyingPrice>
<LandedPrice>
<CurrencyCode>USD</CurrencyCode>
<Amount>9.97</Amount>
</LandedPrice>
<ListingPrice>
<CurrencyCode>USD</CurrencyCode>
<Amount>9.97</Amount>
</ListingPrice>
<Shipping>
<CurrencyCode>USD</CurrencyCode>
<Amount>0.00</Amount>
</Shipping>
</BuyingPrice>
<RegularPrice>
<CurrencyCode>USD</CurrencyCode>
<Amount>15.99</Amount>
</RegularPrice>
<FulfillmentChannel>AMAZON</FulfillmentChannel>
<ItemCondition>New</ItemCondition>
<ItemSubCondition>New</ItemSubCondition>
<SellerId>xxxxxxxxxx</SellerId>
<SellerSKU>Dazzle Tattoos</SellerSKU>
</Offer>
<Offer>
<BuyingPrice>
<LandedPrice>
<CurrencyCode>USD</CurrencyCode>
<Amount>9.97</Amount>
</LandedPrice>
<ListingPrice>
<CurrencyCode>USD</CurrencyCode>
<Amount>9.97</Amount>
</ListingPrice>
<Shipping>
<CurrencyCode>USD</CurrencyCode>
<Amount>0.00</Amount>
</Shipping>
</BuyingPrice>
<RegularPrice>
<CurrencyCode>USD</CurrencyCode>
<Amount>15.99</Amount>
</RegularPrice>
<FulfillmentChannel>AMAZON</FulfillmentChannel>
<ItemCondition>New</ItemCondition>
<ItemSubCondition>New</ItemSubCondition>
<SellerId>xxxxxxxxxx</SellerId>
<SellerSKU>Dazzle Tattoos</SellerSKU>
</Offer>
</Offers>
</Product>
</GetMyPriceForASINResult>
<ResponseMetadata>
<RequestId>xxxxxxxxxxxxxxxxxxxxx</RequestId>
</ResponseMetadata>
</GetMyPriceForASINResponse>
我使用的PHP代码如下。 我使用SimpleXML
在这里,因为我熟悉它,但我相信会有一个DOMDocument
解决方案,以及。
<?php
$file = 'prices.xml';
$doc = simplexml_load_file($file);
// Examine the namespaces
$namespaces = $doc->getNamespaces(true);
print_r($namespaces);
$nsDoc = $doc->children($namespaces['']);
$nsDoc->registerXPathNamespace('p', 'http://mws.amazonservices.com/schema/Products/2011-10-01');
$nodes = $nsDoc->xpath('//p:GetMyPriceForASINResult/p:Product/p:Offers/p:Offer');
foreach ($nodes as $node)
{
print_r($node);
}
我的第一个print_r
会告诉你,你的文档中有命名空间,并且您有只有一个是空的命名空间。 由于这是空的,你的标签不是用字符串(如前缀Amazon:Product
),但仍然命名空间仍然存在。 这看起来是这样的:
Array
(
[] => http://mws.amazonservices.com/schema/Products/2011-10-01
)
然后我得到了文档的名称空间的版本( $doc->children($namespaces[''])
一起工作。 我也声明的名称空间的名称为p
(使用registerXPathNamespace
),这是一个任意名称-你可以使用任何这里对你有意义。 (我曾尝试注册一个空名称( ''
),但没有工作)。
最后,我使用XPath作为意见提出,但由于命名空间适用于父母和所有的孩子,我在每一个标签的前面加了我的命名空间的别名。 (XPath是基本的XML查询语言,它的一个解释需要一本书或一本手册,所以我会从太深这里挖避免。如果你打算做比XML的粗略一点,我建议在网络上寻找一个XML测试应用程序,并尝试一些查询)。
输出端产生两个(相同) <Offer>
节点,它们是这样的:
SimpleXMLElement Object
(
[BuyingPrice] => SimpleXMLElement Object
(
[LandedPrice] => SimpleXMLElement Object
(
[CurrencyCode] => USD
[Amount] => 9.97
)
[ListingPrice] => SimpleXMLElement Object
(
[CurrencyCode] => USD
[Amount] => 9.97
)
[Shipping] => SimpleXMLElement Object
(
[CurrencyCode] => USD
[Amount] => 0.00
)
)
[RegularPrice] => SimpleXMLElement Object
(
[CurrencyCode] => USD
[Amount] => 15.99
)
[FulfillmentChannel] => AMAZON
[ItemCondition] => New
[ItemSubCondition] => New
[SellerId] => xxxxxxxxxx
[SellerSKU] => Dazzle Tattoos
)
SimpleXMLElement Object
(
[BuyingPrice] => SimpleXMLElement Object
(
[LandedPrice] => SimpleXMLElement Object
(
[CurrencyCode] => USD
[Amount] => 9.97
)
[ListingPrice] => SimpleXMLElement Object
(
[CurrencyCode] => USD
[Amount] => 9.97
)
[Shipping] => SimpleXMLElement Object
(
[CurrencyCode] => USD
[Amount] => 0.00
)
)
[RegularPrice] => SimpleXMLElement Object
(
[CurrencyCode] => USD
[Amount] => 15.99
)
[FulfillmentChannel] => AMAZON
[ItemCondition] => New
[ItemSubCondition] => New
[SellerId] => xxxxxxxxxx
[SellerSKU] => Dazzle Tattoos
)
您将要在每个节点内也提领的物品。 要做到这一点,你可以使用对象引用,然后浇注到你想要的类型。 例如:
$fulfillment = (string) $node->FulfillmentChannel;
echo "$fulfillment\n";
在循环中,这将产生我们期望的值:
AMAZON
AMAZON