1

だから私は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.php16警告: simplexml_load_string() [function.simplexml-load-string]: ^ in serviceTest2.php16




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];

これは完璧に機能します。お世話になりました!

4

2 に答える 2

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

于 2013-10-24T14:50:49.937 に答える