是否有一个宽松、允许的PHP XML解析器?

是否有一个宽松、允许的PHP XML解析器?,php,xml,parsing,Php,Xml,Parsing,我正在寻找一个解析器,它允许我采用“最佳猜测”的方法成功解析损坏的xml,例如 <thingy> <description> something <b>with</b> bogus<br> markup not wrapped in CDATA </description> </thingy> 伪造的东西 标记未包装在C

我正在寻找一个解析器,它允许我采用“最佳猜测”的方法成功解析损坏的xml,例如

    <thingy>
       <description>
           something <b>with</b> bogus<br> 
           markup not wrapped in CDATA
       </description>
    </thingy>

伪造的东西
标记未包装在CDATA中
理想情况下,它将生成一个thingy对象,其中包含一个description属性和任何标记

关于如何解决该问题的其他建议(除了从有效的标记开始)欢迎

非php解决方案(例如Beautiful Soup(python))并不在pale之外,但我更愿意坚持公司的主流技能

谢谢

您可以使用(或
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";
}
编辑:一些小的更正和错误处理


edit2:更改为非静态调用以避免E_STRICT错误,添加了测试用例。

一种替代方法是使用库()首先清除HTML。这在相当多相当可怕的输入中幸存了下来,我以前见过有人使用它来刮取相当粗糙的HTML。

你没有理解XML的意义:XML的主要思想是,如果它遇到语法错误,它会杀死你、你的家人、朋友和你曾经交谈过的任何人。没有严格错误处理的XML不再是XML了^^@nikic-我和OP处于同样的位置,必须处理由第三方提供的损坏的“XML”输入,而该第三方不了解XML的意义。虽然我同意这并不理想,但当数据必须导入时,我们无法让第三方修复他们的系统,我们只需要处理它-(就像@Spudley所描述的,是的(提示)如果它能成功解析坏掉的XML,那么它可能是一个非常有用的软件,但它不是一个XML解析器(一致的XML解析器不允许这样做)。唉,两者都失败了——XML一个是因为坏掉的XML,HTML一个是因为“无效”(对于HTML)元素标记。在我现在做的一个测试中,它会发出关于未知html节点的警告,但它会正确加载所有元素(包括这些“未知”标记)。先生,您是正确的-虽然警告是PITA,但我可以为这个特定任务暂时禁用这些警告。只需使用@operator进行特定调用:
@$dom->loadHTMLFile($file)
这就是我的建议。预先处理,一旦格式正确,您就不会验证它。我假设这是某人对RSS webfeed的想法?某人对产品目录的想法,甚至-哦,Carlos的回答是这样的,尽管我可能会按照您的建议使用HTML tidy…只是为了确保内部标记正确我再也不吃别的了。
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$