SimpleXMLElement () - XPath () и SOAP ничего не возвращают - PullRequest
1 голос
/ 08 марта 2012

После нескольких часов поиска, поиска похожих тем и все еще неспособности заставить его работать, я прибегнул к публикации своей конкретной проблемы. Я получаю XML-ответ в кодировке SOAP с сервера, на котором я хочу использовать SimpleXMLElement (), но мне очень трудно установить базовый путь для работы.

Я пробовал два разных метода:

XPath ():

public function XMLParseUserData($xml)
{
    $ActivityData = new SimpleXMLElement($xml);

    $ActivityData->registerXPathNamespace("ns", "http://webservices.website.net/");
    $basePath = $ActivityData->xpath('//ns:GetUserActivityDataResult/ActArray');

    foreach ($basePath->ACT as $userActivity)
    {
        $this->uGUID = $userActivity->UserGUID;
        echo $this->uGUID."<br />";
    }
}

дети ():

public function XMLParseUserData($xml)
{
    $ActivityData = new SimpleXMLElement($xml);

    $basePath = $ActivityData->children('soap',true)->Body->GetUserActivityDataResponse->GetUserActivityDataResult->ActArray->ACT;

    foreach ($basePath as $userActivity)
    {
        $this->uGUID = $userActivity->UserGUID;
        echo $this->uGUID."<br />";
    }
}

XML-ответ:

    <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <soap:Body>
            <GetUserActivityDataResponse xmlns="http://webservices.website.net/">
                <GetUserActivityDataResult>
                    <ResponseCode>SUCCESS</ResponseCode>
                    <FailedUserCount>0</FailedUserCount>
                    <ActCount>1</ActCount>
                    <ActArray>
                        <ACT>
                            <UserGUID>0dc299ba-XXXX-XXXX-XXXX-7ca097d51eb6</UserGUID>
                            <ActDataCount>15</ActDataCount>
                            <ActData>
                                <ACT_DATA>
                                    <Start>2012-03-05T08:40:00</Start>
                                    <End>2012-03-05T09:00:00</End>
                                    <SourceCount>1</SourceCount>
                                    <SourceData>
                                        <ACT_SRC_DATA>
                                            <Source>ACTIPED</Source>
                                            <TypeCount>3</TypeCount>
                                            <TypeData>
                                                <ACT_TYPE_DATA>
                                                    <Type>WALK</Type>
                                                    <S>40</S>
                                                    <C>2</C>
                                                    <D>20</D>
                                                    <T>16</T>
                                                </ACT_TYPE_DATA>
                                                <ACT_TYPE_DATA>
                                                    <Type>RUN</Type>
                                                    <S>20</S>
                                                    <C>2</C>
                                                    <D>20</D>
                                                    <T>10</T>
                                                </ACT_TYPE_DATA>
                                                <ACT_TYPE_DATA>
                                                    <Type>OTHER</Type>
                                                    <S>0</S>
                                                    <C>0</C>
                                                    <D>0</D>
                                                    <T>28</T>
                                                </ACT_TYPE_DATA>
                                            </TypeData>
                                            <MetricCount>0</MetricCount>
                                        </ACT_SRC_DATA>
                                    </SourceData>
                                </ACT_DATA>
                               </ActData>
                            </ACT>
                        </ActArray>
                        <AsOfServerTimeGMT>2012-03-06T16:41:41.513</AsOfServerTimeGMT>
                    </GetUserActivityDataResult>
                </GetUserActivityDataResponse>
            </soap:Body>
        </soap:Envelope>

Ни один из методов не работает, и оба оставляют меня с одной и той же ошибкой:

Warning: Invalid argument supplied for foreach() in /c08/domains/dev.mysite.com/html/class/XMLParse.class.php on line 29

1 Ответ

0 голосов
/ 09 марта 2012

Там написано:

<GetUserActivityDataResponse xmlns="http://webservices.website.net/">

, и вы пытаетесь сделать

$basePath = $soapEnvelope
    ->children('soap', true)
    ->Body
    ->GetUserActivityDataResponse
    …

, что означает, что вы пытаетесь получить <soap:GetUserActivityDataResponse>, который, очевидно, не существует.Вы должны сделать ( demo )

$basePath = $soapEnvelope
    ->children('soap', true)
    ->Body
    ->children('http://webservices.website.net/')
    ->GetUserActivityDataResponse
    ->GetUserActivityDataResult
    ->ActArray
    ->ACT;

На самом деле, вы могли бы просто сделать ->children(), чтобы вернуться к пространству имен по умолчанию, но я считаю, что предоставление пространства имен явно несколько яснее.Ваш выбор.

Ваш XPath не работает, потому что вы не указали пространство имен для ActArray.Кроме того, если xpath() успешно, он возвращает массив SimpleXmlElements.Вы пробовали array->ACT, который не работает, потому что массив не является объектом.Первый ActArray находится в $basePath[0].Поэтому вам нужно настроить код на

$basePath = $soapEnvelope->xpath('//ns:GetUserActivityDataResult/ns:ActArray');
foreach ($basePath[0]->ACT as $userActivity) {
…

Чтобы получить элементы ACT напрямую, измените XPath на

//ns:GetUserActivityDataResult/ns:ActArray/ns:ACT
...