2013-02-25 58 views
-1

我已经从curl请求中收到这个XML。忽略XML之外的无效char?

<?xml version="1.0" encoding="utf-8"?> 
<transaction> 
    <result>PENDING</result> 
    <merchanttransid>343434343</merchanttransid> 
    <transref>23232323</transref> 
    <errorcode>000</errorcode> 
    <errormessage/> 
    <description/> 
</transaction> 
SMTP Error: Could not connect to SMTP host. 

但是,服务器正在回复SMTP的附加错误响应错误:无法连接到SMTP主机。现在,当通过simplexml_load_string()解析时。

它抛出一个错误:

Entity: line 10: parser error: Extra content at the end of the document (Error Number: 2)

由于中,XML是正确的,只是对响应的问题,有没有对如何带额外线的方法吗?

+1

最好的解决方案是让服务的创建者修复它。 – CodeZombie 2013-02-25 08:26:51

+0

XML不正确。这也是为什么SimpleXML在这里给出错误的原因。如果你想加载它,你需要使用姊妹库* DOMDocument *并将恢复设置为true。请参阅[此答案于*“在使用DOMDocument函数处理之前在PHP中修复格式不正确的XML”*](http://stackoverflow.com/a/9281963/367456)。 – hakre 2013-05-10 21:58:43

回答

0

你可以尝试调用函数传递参数忽略读取XML的错误信息:

$xml = simplexml_load_file($url, "SimpleXMLElement", LIBXML_NOERROR | LIBXML_ERR_NONE); 

您可以查看完整列表的选项,你可以通过这个功能:http://www.php.net/manual/en/libxml.constants.php

另一种解决方案(如果你想解析大文件,这不太好)是逐行读取字符,然后删除最后一行。

$xml = '<?xml...?>'; 
$lines = explode("\n", $xml); 
unset($lines[count($lines)-1]); // remove last line 
$output = implode($lines); // output now contains xml without the last line 

希望有所帮助。

+0

即使没有错误,第二个示例也会删除最后一行。 – Voitcus 2013-02-26 08:56:44

+0

是的,那么我们可以把你的解决方案与这个结合起来,只需简单地检查一下,确保最后一行没有任何开放标签。 :-) – vitozev 2013-02-27 08:46:57

0

如果您知道结构将始终如此,请为每一行循环,从左侧剥离空白,并且如果第一个字符与“<”不同,则删除该行。最后给SimpleXML结果。