Расширяя Zend_Service для Amazon BrowseNodes, Предки не обрабатываются - PullRequest
1 голос
/ 25 февраля 2012

Zend Service для Amazon не предоставляет BrowseNodes, поэтому я решил расширить его.Код Zend можно найти по адресу http://framework.zend.com/manual/de/zend.service.amazon.html.

Мой код ниже почти работает, но Just Ancestors не обрабатываются.Интересно, есть ли ошибка в wsdl или xpath.Я пытаюсь отлаживать, но или просто обрабатывать предков.BrowseNodeId, Name, IsCategoryRoot, Children обрабатываются, но массив Ancestors всегда пуст.Запрос xpath может найти детей, но не предков.

Пожалуйста, найдите код ниже.И часть xml

Вот анатомия wsdl для извлечения XML из ItemLookup http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/AnatomyofaWSDL.html

Часть xml response

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

Как я расширяю Zend_Service_Amazon_ Item для BrowseNodes

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 голосов
/ 26 февраля 2012

Я нашел ответ, надеюсь, это поможет и другим.

Есть две ошибки:

  1. Я не знаю, что означает az: но это необходимо. Вместо

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

    С "az:"

        $result = $xpath->query("./az:$el/*", $dom);
    
  2. Я тестировал только с одним Предком, поэтому аргумент в , если , равен true, если у меня есть как минимум два узла в результате. Согласно 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));
            }
        }
    }
...