我正在连接到应该返回我应该解析的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.
整个块是此网关的正常响应。无视“线程被中止。线程被中止。”消息,他们说他们正在努力。
答案 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];
?>