目标:使用现有的XSD架构生成填充和编写XML输出所需的Perl数据结构。
我做了什么:我已经安装了XML::Compile
,找到了如何使用它的教程,并在此处阅读修改后的示例。我已经使用CAM模板编辑器处理了我的XSD文件,以确保CAM可以从模板中生成示例XML文件,我可以将XML输出与XSD进行比较,以确保两者的关联方式与我认为的相应。他们这样做。
接下来,我只是将XML::Compile::Schema
指向XSD文件,然后询问是否创建了模板字符串,要求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>
上面的几个元素都有类型,然后在我所示的部分下面定义,这就是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');
这失败并出现上述错误:
error: cannot find element or attribute named 'Metrics'
想想我可能不明白什么时候需要名称空间限定,什么时候不需要,我合格了Metrics并调用了
my $xml_template = $schema->template('PERL', 'mstns:Metrics');
并且以同样的方式失败。
我见过的定义根元素的其他例子是这样完成的:
<element name = "Metrics">
<complexType>
<sequence>
[etc]
</sequence>
</complexType>
</element>
而不是这个完成的方式,我想知道问题是否是XML :: Compile无法识别的允许样式的某些变化。我根本不知道如何确定为什么template()找不到我指定的元素。
建议?
答案 0 :(得分:5)
指定targetNamespace作为花括号template
调用中的类型...像这样:
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');