1

所以我从肥皂服务(我无法控制)中获取一个 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:URI LMSWebservice 在第16行的serviceTest2.php中不是绝对的警告:simplexml_load_string() [function.simplexml-load-string ]: LSchema"><soap:Body><GetUserInternalIDByPersonalIDResponse xmlns="LMSWebservice" in serviceTest2.php on line 16警告:simplexml_load_string() [function.simplexml-load-string]: ^ in serviceTest2.php on line 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];

效果很好。谢谢你的帮助!

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 回答
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);

使用它对我有很大帮助。

于 2016-10-06T09:40:45.137 回答