SimpleXMLElement() - XPath()& SOAP什么都不返回

时间:2012-03-08 16:47:36

标签: php xml soap simplexml

经过几个小时的搜索,找到类似的线程,仍然无法让它工作我已经使用了我的具体问题。我从服务器上获得了一个SOAP编码的XML响应,我想使用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 :(得分:0)

它说:

<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