当前位置: 首页 > 知识库问答 >
问题:

SoapClient XML返回带有simpleXML的字符串

佘辰龙
2023-03-14

所以我得到了一个xml文件从肥皂服务(我无法控制)。它返回了一个xmlns,这导致了简单的XML问题。我正在运行一个str_replace来解决这个问题,但是现在simpleXML只返回一个空对象。XML结构看起来很好,没有错误,只是一个空对象。

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

print_r($sData);

返回:SimpleXMLElement对象()

str replace之前的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>

更换后:

<?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>

任何帮助都将不胜感激,这快把我逼疯了!

----因此,如果我不清除namespace属性,我会收到以下错误消息:


警告:simplexml\u load\u string()[function.simplexml load string]:实体:第1行:解析器警告:xmlns:URI LMSWebservice在serviceTest2.php第16行

警告:simplexml\u load\u string()[function.simplexml load string]:LSchema“

如果我尝试使用xPath获取UserInternalID,它会返回一个空数组。如果您所说的是正确的,并且正确地进入simpleXML,那么我如何访问UserInternalID节点?对不起,这是第一次使用simpleXML,这让我很困惑。

所以试着改变NS

$feed=str_replace('xmlns=“LMSWebservice”','xmlns=“ns:LMSWebservice”',$xmlString);

没有错误。

我尝试了xPath$ID=$sData-

我知道这可能是完全错误的,但我没有尝试过很多其他方法,因为它似乎没有正确地进入simpleXML/

所以我使用了$ID=$sData-

这很好用。谢谢你的帮助!

共有2个答案

仉联
2023-03-14
$doc = new DOMDocument();
libxml_use_internal_errors(true);
$doc->loadHTML($response);
libxml_clear_errors();
$xml = $doc->saveXML($doc->documentElement);
$xml = simplexml_load_string($xml);

这对我有很大的帮助。

段干昊然
2023-03-14

通过大量注释和上次编辑,最终可以揭示问题的实际原因,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

 类似资料:
  • 问题内容: 我正在使用jQuery的$ .post调用,它返回的字符串带有引号。引号由json_encode行添加。如何停止添加引号?我的$ .post通话中是否缺少某些内容? 问题答案: 返回一个字符串。从文档中: 你需要调用上,这将解析JSON字符串,并把它变成一个对象: 但是,由于在调用中将字符串连接到,将记录的是,它将返回对象的字符串表示形式。因此,您将要登录一个单独的呼叫。像这样:

  • 我想用一个字符串str,把它打印到一个新的行中。重复一遍 示例:return str.repeat(number) 输出:这是要重复的字符串这是要重复的字符串这是要重复的字符串这是要重复的字符串这是要重复的字符串

  • 我对Spring靴开发很陌生,我需要一些帮助。 我正在使用JPA /HibernateSpring和CRU存储库创建一个可恢复的Web服务。(json 格式) 我有以下桌位轨迹: 我有以下实体: 污垢: 控制器: 所以我可以得到所有的Track或通过id搜索它们。 现在我的问题来了,我怎样才能返回所有电影名以“公共”或“私人”开头的音轨。 所以我得到了json的回复,比如: 私人: 我需要过滤文件

  • 问题内容: 对于JUnit测试,我需要一个由多行组成的String。但是我得到的只是一个单行字符串。我尝试了以下方法: 我也尝试了。System.getProperty(“ line.separator”)也不起作用。它产生一个in字符串,没有回车符。那么我该如何解决呢? 问题答案: 感谢您的回答。我错过了我的数据存储在传递给测试方法的。错误是我将字符串放入ArrayList的第一个元素中。这就是

  • 我在一家国际公司工作,因此我们有很多语言需要适应。我对一些特殊的角色有问题。 我创建了一个独立的测试php页面,以消除系统可能引入的任何其他问题。 从我通读的各个页面中,我发现SimpleXML以UTF-8的形式处理XML。例如:返回的PHP SimpleXML值使用奇怪的字符代替连字符和撇号 所以我在页面的顶部这样做: 然后我这样做是为了检查: 不确定这是否是正确的功能,但它在FF和Chome中

  • 问题内容: 我有以下XML: 并且正在尝试阅读office:document-meta节点以提取其下面的各种元素(dc:creator,meta:creation-date等)。 如下代码: 给我: 但是如果我尝试使用以下方法读取document-meta元素: 我懂了 我假设SimpleXML试图从$ officeXML中提取一个不存在的节点“文档”,然后减去(不存在的)常量“元”的值,导致强制