Perl:如何解析无效的XML文档?

时间:2015-03-13 13:29:17

标签: xml perl xml-parsing

我有一个来自外部源代码的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>

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

1 个答案:

答案 0 :(得分:3)

你不是。格式错误的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 - 任何根据定义执行的解析器都会被破坏。