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 文档? [复制]的主要内容,如果未能解决你的问题,请参考以下文章