だから私はsoapサービスからxmlファイルを取得しています(私はそれを制御できません)。simpleXMLの問題を引き起こしているxmlnsを返しています。その問題を取り除くために str_replace を実行していますが、今では simpleXML は空のオブジェクトを返すだけです。XML 構造は問題ないように見えます。空のオブジェクトだけでエラーはありません。
$xmlString = $client->__getLastResponse();
$feed = str_replace(' xmlns="LMSWebservice"', '', $xmlString);
$sData= simplexml_load_string($feed);
print_r($sData);
戻り値: SimpleXMLElement Object()
str 置換前の 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>
<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>
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>
<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-load-string]: エンティティ: 1 行目: パーサー警告: xmlns: 16行目のserviceTest2.phpで URI LMSWebservice が絶対ではありません警告: simplexml_load_string() [function.simplexml-load-string ]: LSchema"><soap:Body><GetUserInternalIDByPersonalIDResponse xmlns="LMSWebservice" in serviceTest2.php行16警告: simplexml_load_string() [function.simplexml-load-string]: ^ in serviceTest2.php行16
xPath を使用して UserInternalID を取得しようとすると、空の配列が返されます。あなたが言っていることが正しく、これが simpleXML に正しく入っている場合、どうすれば UserInternalID ノードにアクセスできますか? 申し訳ありませんが、simpleXML を使用するのはこれが初めてで、これは私を困惑させています。
それで、NSを変更してみました
$feed = str_replace('xmlns="LMSWebservice"', 'xmlns="ns:LMSWebservice"', $xmlString);
これはエラーなしで入ります。
xPath $ID = $sData->xpath('UserInternalID'); に対してこれを試しました。
これはおそらく完全に間違っていることは理解していますが、最初は simpleXML に正しく移行していないようだったので、これ以外のことはあまり試していません。:/
だから私は $ID = $sData->xpath('//UserInternalID'); を使用しました。エコー $ID[0];
これは完璧に機能します。お世話になりました!