当我尝试解析Microsoft windows Task Scheduler schema时,我得到的错误类似于:
参数“PT1M”在/Library/Perl/5.18/XML/Compile/Schema/BuiltInFacets.pm第158行的数字ge(> =)中不是数字
我使用以下代码进行解析,当我尝试使用持续时间和持续时间范围元素的简单手写模式时,它会起作用。所以我知道该模块适用于更复杂的Microsoft模式,它必须在我如何使用它。
#!/usr/bin/perl
use strict;
use warnings;
use XML::LibXML;
use XML::Compile::Schema;
use XML::Compile::Util qw/pack_type/;
my $schema = XML::Compile::Schema->new( "task-scheduler-ms.xsd" );
my $type = pack_type 'http://schemas.microsoft.com/windows/2004/02/mit/task', 'Task';
my $elem = pack_type 'http://schemas.microsoft.com/windows/2004/02/mit/task', 'Task';
$schema->printIndex;
my $read = $schema->compile(READER => $elem);
我怀疑我没有调用必需的模块sub来容纳更复杂的Microsoft模式,但我现在很难过,我在文档中看不到任何有希望尝试下一步的内容。
更新20160114
simbabque正确地建议我应该使用严格和警告,我更新了示例代码。正如他所怀疑的那样,它没有透露任何内容,但这是最好的做法。
Mark(模块作者)怀疑错误消息实际上是由模块中的缺陷引起的,因为持续时间目前不是比较代码中的特殊情况。他之前没有在日期元素上遇到过minInclusive方面。我正在尝试组装一个在持续时间类型元素中使用minInclusive facet的最小XSD,以强制模块发出相同的错误消息。
我通过以下示例代码确认Mark的怀疑:
#!/usr/bin/perl
use strict;
use warnings;
use XML::LibXML;
use XML::Compile::Schema;
use XML::Compile::Util qw/pack_type/;
my $schema = XML::Compile::Schema->new( "duration-range-example-2.xsd" );
my $type = pack_type 'http://tempuri.org/durationExample', 'Duration';
my $elem = pack_type 'http://tempuri.org/durationExample', 'Duration';
$schema->printIndex;
my $read = $schema->compile(READER => $elem);
使用以下示例数据:
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://tempuri.org/durationExample">
<xs:element name="Duration" default="PT10M" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:duration">
<xs:minInclusive value="PT1M"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:schema>
这会产生以下输出:
namespace: http://tempuri.org/durationExample
filename: duration-range-example-2.xsd
definitions of elements:
Duration
Argument "PT1M" isn't numeric in numeric ge (>=) at /Library/Perl/5.18/XML/Compile/Schema/BuiltInFacets.pm line 158.
Argument "PT10M" isn't numeric in numeric ge (>=) at /Library/Perl/5.18/XML/Compile/Schema/BuiltInFacets.pm line 158.
如果可行的话,我会跟进Mark,并在此报告最终结果。
答案 0 :(得分:1)
Mark于2016-01-15发布了XML::Compile::Schema v1.52中BuiltInFacet.pm的补丁,我确认该补丁通过了我的所有测试用例;具有minInclusive和maxInclusive facet的duration-typed元素不再导致模块抛出错误消息。非常感谢和赞美马克。