Scala中的容错XML解析

时间:2009-10-02 21:54:17

标签: java xml scala

我希望能够解析不一定格式良好的XML。例如,我正在寻找一种模糊而非严格的解析器,能够从严重嵌套的标签中恢复。我可以写自己的,但首先要在这里问。

更新

我要做的是从HTML中提取链接和其他信息。在格式良好的XML的情况下,我可以使用Scala XML API。在格式不正确的XML的情况下,以某种方式将其转换为正确的XML(以某种方式)并以相同的方式处理它会很好,否则我必须有两个完全不同的函数集来处理文档。 / p>

显然因为输入结构不正确并且我正在尝试创建格式良好的树,所以必须涉及一些启发式(例如,当您看到<parent><child></parent>时,您将关闭<child> 1}}首先,然后当你看到<child>时你忽略了它。但当然这不是一个正确的语法,因此没有正确的方法。

8 个答案:

答案 0 :(得分:7)

您正在寻找的不是XML解析器。 XML对嵌套,关闭等非常严格。其他一个答案建议Tag Soup。这是一个很好的建议,虽然从技术上来说它比词法分析器更接近词法分析器。如果你想要的XML-ish内容是一个没有任何验证的事件流,那么推出自己的解决方案几乎是微不足道的。只需遍历输入,消耗与正常表达式匹配的内容(这正是Tag Soup所做的)。

问题在于词法分析器无法从解析器中提供您想要的许多功能(例如,生成输入的基于树的表示)。您必须自己实现该逻辑,因为这样的“宽松”解析器无法确定如何处理如下情况:

<parent>
    <child>
    </parent>
</child>

考虑一下:期望从哪种树中走出来?这个问题确实没有合理的答案,这正是解析器不会有多大帮助的原因。

现在,这并不是说您不能使用Tag Soup(或您自己的手写词法分析器)根据此输入生成某种树结构,但实现将非常脆弱。使用像XML这样的面向树的格式,你真的别无选择,只能严格,否则几乎不可能得到一个合理的结果(这是浏览器兼容性很难的部分原因)。

答案 1 :(得分:2)

尝试XHtml对象上的解析器。它比XML上的宽松得多。

答案 2 :(得分:2)

看看htmlcleaner。我已成功使用它将“HTML from the wild”转换为有效的XML。

答案 3 :(得分:1)

尝试Tag Soup

JTidy做了类似的事情,但只针对HTML。

答案 4 :(得分:1)

我大多同意Daniel Spiewak的回答。这只是创建“自己的解析器”的另一种方法。

虽然我不知道任何Scala特定解决方案,但您可以尝试使用Woodstox,这是一个实现StAX API的Java库。 (作为一个基于偶数的API,我假设它将比DOM解析器更容错)

Woodstox周围还有一个名为Frostbridge的Scala包装器,由为Scala制作简单构建工具的人开发。

当我尝试使用Frostbridge时,我对此有不同看法,但也许它更适合您的目的。

答案 5 :(得分:1)

我同意将无效的XML转换为“正确的”XML的答案是不可能的。

为什么不对href进行常规文本搜索?如果您对此感兴趣的话?一个问题是注释掉链接,但如果XML无效,则可能无法确定要注释掉的内容!

答案 6 :(得分:0)

Caucho有一个符合JAXP的XML解析器,它比你通常期望的更宽容一些。 (包括支持处理转义字符实体引用,AFAIK。)

为解析器here

查找JavaDoc

答案 7 :(得分:0)

下面列出了一个相关主题(使用我的解决方案):

Scala and html parsing