XML :: Compile没有找到我给它的根元素

Kir*_*ing 1 xml perl xsd perl-module

目标:使用现有的XSD架构生成填充和编写XML输出所需的Perl数据结构.

我做了什么:我已经安装XML::Compile,找到了如何使用它的教程,并在这里阅读修改过的示例.我已经使用CAM模板编辑器处理了我的XSD文件,以确保CAM可以从模板中生成示例XML文件,我可以将XML输出与XSD进行比较,以确保两者的关联方式与我认为的相应.他们是这样.

接下来,我只是指向XML::Compile::SchemaXSD文件,然后询问是否创建了模板字符串,要求template()从XSD中指定的根元素开始.

什么是错的:"错误:找不到元素或属性'[root_element_name]'

我的XSD确实与我在我发现的例子中看到的不同.这就是我所拥有的:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema.xsd"
    xmlns:mstns="http://tempuri.org/XMLSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"

<xs:annotation></xs:annotation>

<!-- Include XML Schema containing type definitions and data validation -->
  <xs:include id="DataDefinitions" schemaLocation="DataDefinitions_XMLSchema.xsd"></xs:include>

  <!-- Root element -->
  <xs:element name="Metrics" type="metrics"></xs:element>

  <xs:complexType name ="metrics">
    <xs:sequence minOccurs ="1" maxOccurs ="1">
      <xs:element name = ...></xs:element>
      .
      .
      <xs:element name = ....></xs:element>
    </xs:sequence>
  </xs:complexType>

  [other complexType definitions used above to type some of the elements in the complexType 'metrics']

</xs:schema>
Run Code Online (Sandbox Code Playgroud)

上面的几个元素的类型然后在我所示的部分下面定义,这是XSD的本质.我在这里清楚地省略了很多细节,但我不认为('希望')它与问题有关.

即使错误,Perl也非常简单:

use warnings;
use strict;
use XML::LibXML;
use XML::Compile;

my $xsd = 'C:\schema.xsd';
my $schema = XML::Compile::Schema=>new($xsd);
my $xml_template = $schema->template('PERL', 'Metrics');
Run Code Online (Sandbox Code Playgroud)

这失败并出现上述错误:

error: cannot find element or attribute named 'Metrics'
Run Code Online (Sandbox Code Playgroud)

想到我可能不明白什么时候需要命名空间限定,什么时候不需要,我合格了Metrics并且调用了

my $xml_template = $schema->template('PERL', 'mstns:Metrics');
Run Code Online (Sandbox Code Playgroud)

并且以同样的方式失败.

我见过的定义根元素的其他例子是这样完成的:

<element name = "Metrics">
  <complexType>
    <sequence>
      [etc]
    </sequence>
  </complexType>
</element>
Run Code Online (Sandbox Code Playgroud)

而不是这个方式的完成方式,我想知道问题是否是XML :: Compile无法识别的允许样式的某些变化.我根本不知道如何确定为什么template()找不到我指定的元素.

建议?

小智 5

template在花括号中指定targetNamespace作为调用中的类型...像这样:

use warnings;
use strict;
use XML::LibXML;
use XML::Compile;

my $xsd = 'C:\schema.xsd';
my $schema = XML::Compile::Schema=>new($xsd);
my $xml_template = $schema->template('PERL', '{http://tempuri.org/XMLSchema.xsd}Metrics');
Run Code Online (Sandbox Code Playgroud)