所以我從一個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];
這是完美的。謝謝你的幫助!
你不能說對象是否爲空,因爲PHP的'SimpleXMLElement'確實增加對飛行特性(它與魔術完成的),因此使用的var_dump或print_r的用的SimpleXMLElement沒有太大的意義。請參閱:[SimpleXML和print_r() - 爲什麼這是空的?](http://stackoverflow.com/q/3109302/367456) - 它還涵蓋了您認爲simplexml無法處理的XML命名空間相關問題(這是說你的方式是錯誤的)。 – hakre
已添加更多關於您的評論的信息 –
好的,您對警告是正確的,xmlns需要一個URI,'xmlns =「LMSWebservice」'沒有這樣的URI。這實際上意味着您與之通信的服務不是SOAP服務,如果您想要使用它,則必須告知服務供應商有關該問題。其他一切都不明確,您應該使用代理。爲了更好地從無效的XML中恢復,可以用''xmlns =「ns:LMSWebservice」''替換''xmlns =「LMSWebservice」'''。那('ns:LMSWebservice')是一個有效的URI。這可能對你有幫助。 – hakre