为什么我的XSD文件无法使用XML :: LibXML进行解析?

我正在尝试使用 LibXML::Schema Validator CPAN模块验证XML对模式.在同一个脚本中我使用 XML::DOM CPAN模块来解析XML.我希望我的脚本能够使用XML文件对XSD进行验证并解析它.

当我尝试运行脚本时,在对xsd进行验证后,它退出并且不解析XML.我希望它解析XML文件,如果它有效并生成DOM结构.如果有人可以分享一些见解,我将非常感激.

#usr/bin/perl -w
use XML::LibXML;

my $schema = XML::LibXML::Schema->new(location =>'export.xsd');
my $parser = XML::LibXML->new;

my $xml    = 'Export.xml';
my $doc    = $parser->parse_file($xml);

eval { $schema->validate( $doc ) };
print $@ if $@;

print "$xml is valid\n";

use XML::DOM;
#use strict;

my $parser = new XML::DOM::Parser;
my $doc = $parser->parsefile ("Export.xml");

my $productOfferingnodes = $doc->getElementsByTagName("productOfferings")->item(0);
my @productOffering = $productOfferingnodes->getChildNodes();
    {
        foreach  my $productOffering(@productOffering) 
        {
            if ($productOffering->getNodeType == ELEMENT_NODE)
            {
                print $productOffering->getNodeName; 
                     }
             }
     }

错误信息:

模式解析器错误:无法解析XML资源’export.xsd’.

你的代码很乱.你的脚本以一条线开头,这条线是shebang线,但不是.您在此简短脚本中重新定义了两个变量.你检查验证是否失败,即使它确实如此,也要快乐地继续.这些可能不是您的问题的原因,但它们确实使问题的诊断更加困难.我试图重构你的代码.下面的代码传递perl -c.此外,我尝试使用 sample XML and XSD files.如该页面上所述,缺少元素,验证失败.添加缺失信息后,验证成功并生成预期输出.
#!/usr/bin/env perl

use strict; use warnings;

use XML::LibXML;
use XML::DOM;

my $xml = 'Export.xml';
my $xsd = 'export.xsd';

if ( my $error = validate_xml_against_xsd($xml,$xsd) ) {
    die "Validation failed: $error\n";
}

my @offerings = get_product_offerings( $xml );
print "$_\n" for @offerings;

sub get_product_offerings {
    my ($xml) = @_;

    my $parser = XML::DOM::Parser->new;
    my $doc = $parser->parsefile($xml);

    my $nodes = $doc->getElementsByTagName("book")->item(0);

    return map {
        $_->getNodeType == ELEMENT_NODE
                         ? $_->getNodeName
                         : ()
    } $nodes->getChildNodes;
}

sub validate_xml_against_xsd {
    my ($xml,$xsd) = @_;

    my $schema = XML::LibXML::Schema->new(location => $xsd);
    my $parser = XML::LibXML->new;

    my $doc = $parser->parse_file($xml);
    eval { $schema->validate( $doc ) };

    if ( my $ex = $@ ) {
        return $ex;
    }
    return;
}

输出:

author
title
genre
price
pub_date
review

顺便说一句,验证失败时的错误消息提供了信息:验证失败:元素’审核’:不期望此元素.预计是(pub_date).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇