我正在寻找一种解析器,该解析器将使我能够成功解析损坏的xml,例如采用“最佳猜测”方法。
<thingy>
<description>
something <b>with</b> bogus<br>
markup not wrapped in CDATA
</description>
</thingy>
理想情况下,它将产生一个带有说明属性和内部任何标记汤的东西。
欢迎提供有关如何解决问题的其他建议(除了需要有效的标记之外)。
非php解决方案(例如Beautiful Soup(python))并非没有道理,但我更愿意坚持公司中的主要技能
谢谢!
最佳答案
您可以使用 DOMDocument::loadHTML()
(或DOMDocument::loadhtmlfile()
)将损坏的XML转换为正确的XML。如果您不喜欢处理DOMDocument
对象,则使用saveXML()
并使用SimpleXML加载生成的XML字符串。
$dom = DOMDocument::loadHTMLfile($filepath);
if (!$dom)
{
throw new Exception("Could not load the lax XML file");
}
// Now you can work with your XML file using the $dom object.
// If you'd like using SimpleXML, do the following steps.
$xml = new SimpleXML($dom->saveXML());
unset($dom);
我已经尝试过以下脚本:
<?php
$dom = new DOMDocument();
$dom->loadHTMLFile('badformatted.xml');
if (!$dom)
{
die('error');
}
$nodes = $dom->getElementsByTagName('description');
for ($i = 0; $i < $nodes->length; $i++)
{
echo "Node content: ".$nodes->item($i)->textContent."\n";
}
从CLI执行此命令时的输出:
carlos@marmolada:~/xml$ php test.php
Warning: DOMDocument::loadHTMLFile(): Tag thingy invalid in badformatted.xml, line: 1 in /home/carlos/xml/test.php on line 3
Warning: DOMDocument::loadHTMLFile(): Tag description invalid in badformatted.xml, line: 2 in /home/carlos/xml/test.php on line 3
Node content:
something with bogus
markup not wrapped in CDATA
carlos@marmolada:~/xml$
编辑:一些小的更正和错误处理。
edit2:更改为非静态调用以避免E_STRICT错误,添加了测试用例。