我有一个来自外部源代码的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>
我可以解析这个错误的文件而不会死吗?也许从解析器中删除此项并发出警告(而不是死!)或以某种方式忽略错误?
答案 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 - 任何根据定义执行的解析器都会被破坏。