2014-09-23 29 views
1

我无法理解perl模式编译器的输出,看起来在某些情况下maxOccurs指示器被忽略。如果我尝试多次使用一个复杂元素,那么第一个引用似乎是正确的,但是,即使maxOccurs指示符设置为“1”,后续引用也会作为数组输出。我只是开始玩XML模式,所以我的理解是非常有限的。XML ::编译maxOccurs =“1”似乎无界

我有以下模式(对不起,我试图削减下来尽可能地):

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

    <xs:element name="Top"> 
    <xs:complexType> 
     <xs:sequence>   
     <xs:element ref="Foo" minOccurs="0" maxOccurs="1"/> 
     <xs:element ref="Bar" minOccurs="0" maxOccurs="1"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="Foo"> 
    <xs:complexType> 
     <xs:sequence>   
     <xs:element ref="Bar" minOccurs="0" maxOccurs="1"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="Bar"> 
    <xs:complexType> 
     <xs:attribute name="Baz" use="optional" /> 
    </xs:complexType> 
    </xs:element> 

</xs:schema> 

当我运行:

perl -MXML::Compile::Schema -e 'print XML::Compile::Schema->new("example.xsd")->template("PERL", "Top");' 

我得到以下输出:

# is an unnamed complex 
{ # sequence of Foo, Bar 

    # is an unnamed complex 
    # is optional 
    Foo => 
    { # sequence of Bar 

    # is an unnamed complex 
    # is optional 
    Bar => 
    { # is a xs:anyType 
     # becomes an attribute 
     Baz => "anything", }, }, 

    # is an unnamed complex 
    # complex structure shown above 
    # is optional 
    Bar => [{},], } 

作为Foo元素的“Bar”显示为复杂(如预期),但顶层下的“Bar”出现d列表复杂,即使maxOccurs =“1”(不是我所期望的)。我的理解是错误的还是我的模式不正确?

回答

0

输出将始终是一个数组,但在您的情况下,它仅限于第一个。这是为了保持访问数据的语法一致,而不管maxOccurs的值如何。

+0

谢谢AKHolland,我试图为每个实体创建一个Class :: Struct,以便我可以更容易地填充它们,但是在这种情况下Bar会初始化为一个数组。我想我可能不得不走完整个dom树来完成这个,这可能不值得麻烦。 – Rajuk 2014-09-26 14:32:43