【问题标题】:Validating XML in Perl with libxml and an XSD file使用 libxml 和 XSD 文件在 Perl 中验证 XML
【发布时间】:2010-08-03 17:59:39
【问题描述】:

我正在尝试让我的 perl 脚本从在线获取 Xxml 文件并根据 XSD 文件对其进行验证。

执行此操作的代码如下:

my $url = shift @ARGV;
my $response = $ua->get($url) || die "Can't fetch file";
my $file = $response->content;

my $schema_file = "schema.xsd";
my $schema = XML::LibXML::Schema->new(location => $schema_file);
my $parser = XML::LibXML->new;
my $doc    = $parser->parse_string($file);
eval { $schema->validate($doc) };
die $@ if $@;

运行这个会导致一个神秘的错误:“元素cropdata 内容检查失败”(cropdata 是我的第一个非根标签)。

在我的 XSD 文件中,条目如下所示:

<xs:element name="cropdata">
<xs:complexType>
<xs:sequence>

然后是一堆“&lt;xs:element..../>” 然后:

</xs:sequence>
</xs:complexType>
</xs:element>

进入 perl 调试器显示,在让行 "my $doc = $parser-&gt;parse_string($file);" 运行后,$doc 打印为 XML::LibXML::Document=SCALAR(0x6b99f0)。

谁能帮我弄清楚我做错了什么? (警告:这可能是一个愚蠢的错误,我不会把它放在我自己身上)。

【问题讨论】:

  • 在 parse_string 调用之后立即尝试 use Data::Dumper; Dumper($doc); -- $doc 对象看起来正确吗?
  • @Ether,$doc 几乎肯定会是一个数字的标量引用,该数字是 C 数据结构的内存地址。
  • 输入的 XML 是什么样的?它对每个架构都有效吗?
  • 天哪,谢谢吉姆。事实证明,我提供的示例 xml 文件是无效的,你瞧,在 xmllint 中检查并更正后,一切正常。
  • 您能否将其发布为答案并接受它(这样问题就不会显示为“未回答”,这意味着人们会浪费时间查看它)谢谢 :)

标签: xml perl xsd xml-validation xml-libxml


【解决方案1】:

原来我提供的示例 xml 文件是无效的,你瞧,在 xmllint 中检查并更正后,一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    相关资源
    最近更新 更多