XML ::编译没有找到根元素我给它(XML::Compile does not find the

2019-10-20 03:11发布

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

我做了什么:我已经安装了XML::Compile ,发现这里怎么使用它,并通读变形例的教程。 我已经处理使用CAM模板编辑器,以确保CAM可以生成从模板,这是可以的,我比较了XML输出到XSD以确保两个涉及我认为他们应该呈现方式的一例XML文件我的XSD文件。 他们是这样。

接下来,我只是指出XML::Compile::Schema的XSD文件,然后问了模板字符串创建,问模板()的根元素作为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'

想我可能需要命名空间限定的时候不明白,当它不是,我有资格指标和所谓的

my $xml_template = $schema->template('PERL', 'mstns:Metrics');

和失败一样。

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

<element name = "Metrics">
  <complexType>
    <sequence>
      [etc]
    </sequence>
  </complexType>
</element>

而比这做的方式,我不知道问题出在允许的风格,XML ::编译不能识别一些变化。 我根本不知道如何确定为什么模板()没有找到我指定的元素。

建议?

Answer 1:

指定目标名称作为你的类型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');


文章来源: XML::Compile does not find the root element I give it