2012-03-08 63 views
1

经过数小时的搜索,找到类似的线程,仍然无法使其工作我已经诉诸张贴我的具体问题。我想从使用SimpleXMLElement()的服务器获取SOAP编码的XML响应,但是我真的很难建立起工作的基本路径。SimpleXMLElement() - XPath()和SOAP什么都不返回

我已经试过两种不同的方法:

的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 
+0

[我得到很多* *更多的错误(http://codepad.org/该XML的z4tT7INz)。它是无效的,不能被解析为XML。 – Gordon 2012-03-08 17:45:30

+1

我的不好。反应是巨大的+100多标签,所以我缩短它的显示目的和意外减少关闭标签。发布编辑。 – 2012-03-09 09:54:22

回答

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()跳回默认的命名空间,但我发现提供明确的命名空间更为清楚。你的选择。因为你没有指定命名空间ActArray

你的XPath失败。另外,当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 
+1

啊,我明白了。不远处!非常好,非常感谢Gordon! – 2012-03-09 11:22:11