从包含php中其他额外垃圾的字符串中解析XML

时间:2012-11-27 03:48:48

标签: php xml string parsing

我正在连接到应该返回我应该解析的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.

整个块是此网关的正常响应。无视“线程被中止。线程被中止。”消息,他们说他们正在努力。

3 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分: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!

答案 2 :(得分:0)

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

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

这个想法很简单,使用正则表达式获取<?xml标记和XML的结束标记。然后函数preg_match()返回$ matches数组中的所有内容。

希望它有所帮助。

<?php
$exp = '/<\?xml.*<\/Inicio>/';
preg_match($exp, $string, $matches ,PREG_OFFSET_CAPTURE, 0);
echo $matches[0][0];
?>