Perl:如何解析无效的 XML 文档? [复制]

Posted

技术标签:

【中文标题】Perl:如何解析无效的 XML 文档? [复制]【英文标题】:Perl: How to parse invalid XML document? [duplicate] 【发布时间】:2015-05-16 00:12:00 【问题描述】:

我有一个来自外部源的 XML 文档,我每天都需要使用 XML::Simple perl 模块一遍又一遍地解析它。我的脚本是从 crontab 运行的,如果 XML 文档正常,它可以正常工作。但是如果文档无效,我会收到错误消息并死掉,如下所示:

junk after document element at line 740774, column 0, byte 36355798 at /usr/local/lib/perl/5.18.2/XML/Parser.pm line 187.

我在 XML 文档中找到了这一行,它看起来像这样:

<item>
    <element1>value1</element1>
    <element2>value2</element2>
    value3</element3>
    <element4>value4</element4>
</item>

我可以在不死的情况下解析这个错误的文档吗?也许从解析器中删除这个项目并发出警告(而不是死!)或者以某种方式忽略错误?

【问题讨论】:

不,您无法解析格式错误的 XML。您需要说服创建数据的人正确地执行它,或者在处理它之前自己修复它。错误总是相似的吗? 不,它们是变量...我认为它来自源系统的开发人员。如果他们犯了错误,我会得到格式错误的 XML。 不要将其视为 XML。可以将其视为创始人发明的专有语法。为这个语法写一个文法,如果有必要的话对其进行逆向工程,然后为这个文法写一个解析器。昂贵,但完全可行。如果您想要更便宜的选择,请说服供应商采用 XML:使用标准可以为每个人节省资金。 或者,不要使用此数据馈送。毕竟,如果他们无法获得正确的语法,你为什么要相信内容呢?应该是垃圾吧。 这不是替代品。我需要使用它。但是构建一个自己的解析器......这是一个聪明的想法。谢谢。 【参考方案1】:

你没有。格式错误的 XML 是一个致命错误,您绝对不应该尝试修复它。

这是一个致命的错误根据定义,因为如果没有它,解析器最终将不得不处理各种边缘情况。因此,您应该拒绝 XML,并告诉上游人员修复它。

见:Dealing with malformed XML

尤其是:http://www.xml.com/axml/notes/Draconian.html

我们希望 XML 使程序员能够编写可以通过 Web 传输并在大量桌面上执行的代码。但是,如果此代码必须包括对各种草率的最终用户实践的错误处理,那么它的大小必然会膨胀到像 Netscape Navigator 或 Microsoft Internet Explorer 一样,大小达到数十兆字节,因此失败的目的。

在这种情况下 - 你也不应该使用 XML::Simple 它的文档:

不鼓励在新代码中使用此模块。其他模块也可以提供更直接和一致的接口。

基本上 - XML::Simple 在于它不是一个简单的 XML 解析器。它是 for 简单的 XML。还有更好的选择。

我会建议考虑像XML::Twig 这样的东西。 (还有其他选择 - 这是我最喜欢的)。

但两者都不会处理格式错误的 XML - 任何可以处理的解析器根据定义 已损坏。

【讨论】:

@netdjw:发起者在将 XML 发送给您之前验证 XML 非常容易。他们甚至可以通过xmlvalidation.com 在线完成

以上是关于Perl:如何解析无效的 XML 文档? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Perl,如何解析 XML 文件,xpath

Flex TextArea - 从 Word 复制/粘贴 - xml 解析中的 unicode 字符无效

perl:如何按顺序解析 xml 文件

如何在 Perl 中清理无效的 UTF-8?

解析Xml数据错误:文本内容中发现无效字符怎么处理

XML / Java:解析标签和属性时的精确行和字符位置?