2

我正在连接一个支付网关,该网关应该返回一个我应该解析的 XML 字符串。但是,WS 返回的字符串在实际 XML 之前包含一个 HTML 标头。

我已经和那里的技术人员谈过了,他们说他们的系统就是这样工作的,我应该按照自己的方式进行管理。

所以我的问题是:有没有一种简单的方法可以只从字符串中提取 XML 并丢弃其余的?

谢谢!

感谢所有的回复!我在下面添加了一个示例。

HTTP/1.1 100 Continue

HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 300
Content-Type: text/html; charset=utf-8
X-AspNet-Version: 2.0.50727
Date: Fri, 23 Nov 2012 15:02:17 GMT

<?xml version='1.0' encoding='utf-8' standalone='yes' ?><Inicio><Nrocom>xxxxxx</Nrocom><Nroterm>xxxxxx</Nroterm><Moneda>858</Moneda><Importe>000</Importe><Plan>001</Plan><Tcompra>0</Tcompra><Info></Info><Rsp>2222</Rsp><Idtrn>000000</Idtrn></Inicio>Thread was being aborted.Thread was being aborted.

这整个块是来自该网关的正常响应。忽略“线程被中止。线程被中止”。消息,他们说他们正在努力。

4

3 回答 3

0

好吧,我有点让它以某种方式工作。

不要将此视为完美的解决方案。我很确定还有很多其他更好的方法可以做到这一点,因为我不得不“学习”正则表达式来获得它。

思路很简单,使用正则表达式获取<?xmlXML的标签和结束标签。函数 preg_match() 然后返回 $matches 数组中的所有内容。

希望能帮助到你。

<?php
$exp = '/<\?xml.*<\/Inicio>/';
preg_match($exp, $string, $matches ,PREG_OFFSET_CAPTURE, 0);
echo $matches[0][0];
?>
于 2012-11-27T19:44:15.247 回答
0

这是一个非常简洁的示例,说明了一种可能性,而您不知道您正在使用的数据。

$string = '
<html>
  <head>
    <title>Untitled</title>
  </head>
  <body>
    <xmlroot>
      <item>hello</item>
      <item>world</item>
    </xmlroot>
  </body>
</html>
';

if($xml = new SimpleXMLElement($string) and $item = $xml->xpath('//xmlroot'))
{
  echo $item[0]->asXML();
}
于 2012-11-27T04:01:19.950 回答
0

所以我刚刚看到你的编辑,你想做的就是<?xml只找到并解析这个。

$beginTag = "<?xml";
$xmlDoc = substr($response, strpos($response, $beginTag));

echo $xmlDoc;

这段代码给出了这个输出:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?><Inicio><Nrocom>xxxxxx</Nrocom><Nroterm>xxxxxx</Nroterm><Moneda>858</Moneda><Importe>000</Importe><Plan>001</Plan><Tcompra>0</Tcompra><Info></Info><Rsp>2222</Rsp><Idtrn>000000</Idtrn></Inicio>Thread was being aborted.Thread was being aborted.

显然,这XML是无效的,但我想当Thread was being aborted.问题得到解决时,您将收到有效的 XML!

于 2012-11-27T04:02:57.280 回答