为Amazon BrowseNodes扩展Zend_Service,不处理祖先

时间:2012-02-25 12:27:43

标签: php xml zend-framework xpath amazon-web-services

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

1 个答案:

答案 0 :(得分:0)

我找到了答案,希望它也有助于其他人。

有两个错误:

  1. 我不知道az:代表什么,但需要它。而不是

        $result = $xpath->query("./$el/*", $dom);
    

    使用“az:”

        $result = $xpath->query("./az:$el/*", $dom);
    
  2. 我一直在测试只有一个Ancestor,所以 if 中的参数是真的,如果我在结果中至少有两个节点。根据WSDL,我可以使用具有多个祖先的BrowseNodes结果,但它们必须是罕见的,或者我只查找只有一个祖先的项目。

        if ($result->length > 1) {
    

    应该是:

        if ($result->length > 0) {
    
  3. 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));
                }
            }
        }