【发布时间】:2014-06-18 18:13:34
【问题描述】:
我正在尝试使用 LibXML 编写一个 perl 脚本,该脚本根据 dtd 验证文档并返回关于文档是否有效的布尔值。我希望能够在 xml 文件的文件夹上运行脚本,报告哪些是有效的,哪些不是,并记录那些无效的错误。
我的脚本确实验证了一个文档,但它在第一个无效文档处停止。
use strict;
use warnings;
no warnings 'uninitialized';
use XML::LibXML;
use IO::Handle;
# script to test dtd validity against test xml instance
my $instance = 'C:\jason\code\perl\dev\well-formed-test\family-instance1.xml';
$instance =~ s#\\#/#g;
print "about to test $instance \nagainst dtd\n\n";
my $parser = XML::LibXML->new();
$parser->validation(1);
print "here we go...\n";
print "test : ", &isValid( $instance );
print "after sub.\n";
sub isValid {
my $file = shift;
return $parser->parse_file($instance);
}
我在下面的脚本上尝试了许多变体,不使用那个子,将 parse 命令放在 eval 块中,等等。
根据this tutorial.,我在使用 filehandle->fd_open 时遇到了问题。我也不清楚 parse_file 函数根据cpan docs.返回什么
返回关于文档是否有效的布尔值的最佳方法是什么?
这是 xml 文档:
<?xml version="1.0"?>
<!DOCTYPE family SYSTEM "family.dtd">
<family>
<member gender="female">
<firstName>Sally</firstName>
<lastName>Smith</lastName>
</member>
<member gender="male">
<firstName>Bernie</firstName>
<lastName>Smith</lastName>
</member>
<member gender="female">
<firstName>Anna</firstName>
<lastName>Smith-Jones</lastName>
</member>
</family>
和 dtd:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT family (member+)>
<!ELEMENT member (firstName, lastName)>
<!ATTLIST member gender (male|female) 'male'>
<!ELEMENT firstName (#PCDATA)>
<!ELEMENT lastName (#PCDATA)>
如果文件有效,脚本会按预期运行(它会在“子”之后到达该行),但是当我添加导致失败的标签时
<sometag/>
脚本打印出错误,但没有到达最后一行。 谢谢!
【问题讨论】:
-
sub isValid { my $file = shift; return eval { $parser->parse_file($file); 1 }; }