Zend Service for Amazon不提供BrowseNodes,因此我决定对其进行扩展。 Zend代码可以在http://framework.zend.com/manual/de/zend.service.amazon.html找到。
我的代码几乎可以使用,但只是祖先没有被处理。我想知道wsdl或xpath中是否有错误。我正在尝试调试,但或者只是处理Ancestors。 BrowseNodeId,Name,IsCategoryRoot,处理子项,但Ancestors数组始终为空。 xpath查询能够查找Children,但不能查找祖先。
请在下面找到代码。和xml的一部分
以下是ItemLookup的XML提取的wsdl的解剖结构 http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/AnatomyofaWSDL.html
部分 xml回复
<BrowseNodes>
<BrowseNode>
<BrowseNodeId>10605</BrowseNodeId>
<Name>Education</Name>
<Children>...</Children>
<Ancestors>
<BrowseNode>
<BrowseNodeId>21</BrowseNodeId>
<Name>Education & Reference</Name>
<Ancestors>
<BrowseNode>
<BrowseNodeId>1000</BrowseNodeId>
<Name>Subjects</Name>
<IsCategoryRoot>1</IsCategoryRoot>
<Ancestors>
<BrowseNode>
<BrowseNodeId>283155</BrowseNodeId>
<Name>Books</Name>
</BrowseNode>
</Ancestors>
</BrowseNode>
</Ancestors>
</BrowseNode>
</Ancestors>
</BrowseNode>
</BrowseNodes>
我如何为 BrowseNodes
扩展Zend_Service_Amazon_ 项目class Zend_Service_Amazon_Item
{
/**
* @var array
*/
public $BrowseNodes = array();
public function __construct($dom) {
// .... the code for the other items
// .... for browsenode
$result = $xpath->query('./az:BrowseNodes/*', $dom);
if ($result->length > 1) {
/**
* @see Zend_Service_Amazon_BrowseNode
*/
require_once 'Zend/Service/Amazon/BrowseNode.php';
foreach ($result as $r) {
$this->BrowseNodes[] = new Zend_Service_Amazon_BrowseNode($r);
}
}
}
}
我为浏览节点
创建了一个新的类class Zend_Service_Amazon_BrowseNode
{
/**
* @var integer
*/
public $BrowseNodeId;
/**
* @var string
*/
public $Name;
/**
* @var boolean
*/
public $IsCategoryRoot;
/**
* @var array BrwoserNodes
*/
public $Ancestors = array();
/**
* @var string
*/
public $Children = array();
/**
* Assigns values to properties relevant to BrowseNode
*
* @param DOMElement $dom
* @return void
*/
public function __construct(DOMElement $dom)
{
$xpath = new DOMXPath($dom->ownerDocument);
$xpath->registerNamespace('az', 'http://webservices.amazon.com/AWSECommerceService/2011-08-01');
foreach (array('BrowseNodeId', 'Name') as $el) {
$result = $xpath->query("./az:$el/text()", $dom);
if ($result->length == 1) {
$this->$el = (string) $result->item(0)->data;
}
}
$result = $xpath->query('./az:IsCategoryRoot/text()', $dom);
if ($result->length == 1) {
$this->IsCategoryRoot = (bool) $result->item(0)->data ;
}
foreach (array('Children','Ancestors') as $el) {
$result = $xpath->query("./$el/*", $dom);
if ($result->length > 1) {
foreach ($result as $r) {
array_push($this->$el, new Zend_Service_Amazon_BrowseNode($r));
}
}
}
}
}
答案 0 :(得分:0)
我找到了答案,希望它也有助于其他人。
有两个错误:
我不知道az:代表什么,但需要它。而不是
$result = $xpath->query("./$el/*", $dom);
使用“az:”
$result = $xpath->query("./az:$el/*", $dom);
我一直在测试只有一个Ancestor,所以 if 中的参数是真的,如果我在结果中至少有两个节点。根据WSDL,我可以使用具有多个祖先的BrowseNodes结果,但它们必须是罕见的,或者我只查找只有一个祖先的项目。
if ($result->length > 1) {
应该是:
if ($result->length > 0) {
Zend_Service_Amazon_BrowseNode
的最后一部分再次修正了代码 foreach (array('Children','Ancestors') as $el) {
$result = $xpath->query("./az:$el/*", $dom);
if ($result->length > 0) {
foreach ($result as $r) {
array_push($this->$el, new Zend_Service_Amazon_BrowseNode($r));
}
}
}