2013-10-24 78 views
1

所以我從一個SOAP服務(我無法控制)返回一個XML文件。它返回一個導致simpleXML問題的xmlns。我正在運行一個str_replace來擺脫這個問題,但是現在simpleXML只是返回一個空對象。 XML結構似乎很好,沒有錯誤只是一個空的對象。SoapClient XML返回字符串與simpleXML

$xmlString = $client->__getLastResponse(); 
$feed = str_replace(' xmlns="LMSWebservice"', '', $xmlString); 
$sData= simplexml_load_string($feed); 

print_r($sData); 

返回:SimpleXMLElement對象()

XML源之前STR取而代之的是:

<?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> 
      <GetUserInternalIDByPersonalIDResponse xmlns="LMSWebservice"> 
       <GetUserInternalIDByPersonalIDResult> 
        <Response xmlns=""> 
         <Timestamp date="24/10/2013" time="04:27:37" /> 
         <User> 
          <UserInternalID>4907</UserInternalID> 
         </User> 
        </Response> 
       </GetUserInternalIDByPersonalIDResult> 
      </GetUserInternalIDByPersonalIDResponse> 
     </soap:Body> 
    </soap:Envelope> 

海峽後替換:

<?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> 
      <GetUserInternalIDByPersonalIDResponse> 
       <GetUserInternalIDByPersonalIDResult> 
        <Response xmlns=""> 
         <Timestamp date="24/10/2013" time="04:27:37" /> 
         <User> 
          <UserInternalID>4907</UserInternalID> 
         </User> 
        </Response> 
       </GetUserInternalIDByPersonalIDResult> 
      </GetUserInternalIDByPersonalIDResponse> 
     </soap:Body> 
    </soap:Envelope> 

任何幫助將不勝感激,這正在讓我瘋狂!

----所以,如果我沒有擺脫命名空間屬性的我收到此錯誤信息:


警告:simplexml_load_string()[function.simplexml負荷字符串]:實體:第1行:解析器警告:的xmlns:URI LMSWebservice不是絕對serviceTest2.php上線

警告:simplexml_load_string()[function.simplexml負荷字符串]:LSchema " > <皁:車身> < GetUserInternalIDByPersonalIDResponse的xmlns = " LMSWebservice "在serviceTest2.php上線

警告:simplexml_load_string()[function.simplexml負荷字符串]:^在serviceTest2 .php on line

如果我嘗試使用xPath獲取UserInternalID它r蝕刻一個空陣列。如果你所說的是正確的,並且正確地進入了simpleXML,那麼我如何訪問UserInternalID節點?對不起,這是第一次使用simpleXML,這只是讓我困惑。

所以才試圖改變NS

$飼料= str_replace函數( '的xmlns = 「LMSWebservice」', '的xmlns = 「NS:LMSWebservice」',$的xmlString);

它無誤地進入。

我試過這個xPath $ ID = $ sData-> xpath('UserInternalID');

我明白這可能是完全錯誤的,但我沒有嘗試過很多,因爲它似乎沒有正確進入simpleXML。:/

因此,我已經使用 $ ID = $ sData->的xpath( '// UserInternalID'); echo $ ID [0];

這是完美的。謝謝你的幫助!

+0

你不能說對象是否爲空,因爲PHP的'SimpleXMLElement'確實增加對飛行特性(它與魔術完成的),因此使用的var_dump或print_r的用的SimpleXMLElement沒有太大的意義。請參閱:[SimpleXML和print_r() - 爲什麼這是空的?](http://stackoverflow.com/q/3109302/367456) - 它還涵蓋了您認爲simplexml無法處理的XML命名空間相關問題(這是說你的方式是錯誤的)。 – hakre

+0

已添加更多關於您的評論的信息 –

+0

好的,您對警告是正確的,xmlns需要一個URI,'xmlns =「LMSWebservice」'沒有這樣的URI。這實際上意味着您與之通信的服務不是SOAP服務,如果您想要使用它,則必須告知服務供應商有關該問題。其他一切都不明確,您應該使用代理。爲了更好地從無效的XML中恢復,可以用''xmlns =「ns:LMSWebservice」''替換''xmlns =「LMSWebservice」'''。那('ns:LMSWebservice')是一個有效的URI。這可能對你有幫助。 – hakre

回答

0

經過廣泛徵求意見和上次編輯最後你的問題的真正原因可能是透露,XPath表達式是錯誤的:

$ID = $sData->xpath('UserInternalID'); 

錯了,是路徑,這沒有任何元素匹配。相反,你可以使用:

$ID = (string) $xml->xpath('//UserInternalID')[0]; 

或者更詳細:

$ID = (string) $xml->xpath('//Response/User/UserInternalID')[0]; 

這裏的關鍵點是,你寫的正確路徑,你想查詢的元素。

完整的使用示例:

<?php 
/** 
* SoapClient xml return string with simpleXML 
* 
* @link http://stackoverflow.com/q/19556414/367456 
*/ 

$response = <<<RESPONSE 
<?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> 
      <GetUserInternalIDByPersonalIDResponse xmlns="LMSWebservice"> 
       <GetUserInternalIDByPersonalIDResult> 
        <Response xmlns=""> 
         <Timestamp date="24/10/2013" time="04:27:37" /> 
         <User> 
          <UserInternalID>4907</UserInternalID> 
         </User> 
        </Response> 
       </GetUserInternalIDByPersonalIDResult> 
      </GetUserInternalIDByPersonalIDResponse> 
     </soap:Body> 
    </soap:Envelope> 
RESPONSE; 

$restore = libxml_use_internal_errors(TRUE); 
$xml  = simplexml_load_string($response); 
libxml_use_internal_errors($restore); 

echo $xml->xpath('//Response/User/UserInternalID')[0]; 

輸出:

4907 

在線演示:https://eval.in/57149

0
$doc = new DOMDocument(); 
libxml_use_internal_errors(true); 
$doc->loadHTML($response); 
libxml_clear_errors(); 
$xml = $doc->saveXML($doc->documentElement); 
$xml = simplexml_load_string($xml); 

使用幫我的一大途徑。