在XML :: COMPILE :: SCHEMA中附加标记或多个标记

时间:2014-12-19 11:51:15

标签: xml perl xsd

我已经提供了一个xsd文件,一个Perl Enviroment并且只能使用     XML::LibXML , XML::SAX, XML::Compile

xsd的相关部分是

<complexType name="property">
<attribute type="propertyvalue" name="name" use="required"/>
<attribute type="string" name="value" use="required"/>
</complexType>
<simpleType name="propertyvalue">
<restriction base="string">
<enumeration value="propertya"/>
<enumeration value="propertyb"/>
  [....some more values...]
</restriction>   
</simpleType>

我必须为每个值写出多个属性。 到目前为止,我使用XML :: Compile :: Schema

$schema->template('PERL', $type); 
my $doc    = XML::LibXML::Document->new('1.0', 'UTF-8');
my $write  = $schema->compile(WRITER => $type, use_default_namespace => 1);
my %hash;
$hash = {
properties =>
            {
             version => 42,
             property =>
                        [ {name => "propertya",
                           value => "example",
                        }, ],
            }   
        };
my $xml= $write->($doc, $hash);
$doc->setDocumentElement($xml);    

我现在的问题是,我无法看到如何添加多个属性标签的方式,如

@properties =("propertya","propertyb",[.and so on.]);
foreach my $pname (@properties){
$hash = {
          properties =>
          { 
                       version => 42,
                       property =>
                                  [ {name => $pname;
                                     value => "example",
                                  }, ],
        }   
};
my $xml= $write->($doc, $hash);
$doc->setDocumentElement($xml);
}

不覆盖所有内容或获取文件其他部分缺失的消息。 反正有没有这样做,有没有办法在执行后附加标签     my $xml = $write->($doc, $hash);

1 个答案:

答案 0 :(得分:1)

哈希值中的propery只是一个匿名的数组/数组引用。因此,您可以在foreach循环中将属性简单地处理为名称值对,并将它们推送到数组。然后你只需要创建一次xml哈希并给它引用你在foreach循环中构建的props数组。

use strict;
use warnings;
use Data::Dumper;

my @properties=("propertya","propertyb","propertyc");
my @props;
foreach my $pname (@properties){
        push(@props, {name=>$pname, value=>'example'});
}

my $hash = {
properties =>
            {
             version => 42,
             property => \@props
            }
};

print Dumper $hash

正如您所看到的,该属性现在具有一系列属性。

$VAR1 = {
          'properties' => {
                            'version' => 42,
                            'property' => [
                                            {
                                              'value' => 'example',
                                              'name' => 'propertya'
                                            },
                                            {
                                              'value' => 'example',
                                              'name' => 'propertyb'
                                            },
                                            {
                                              'value' => 'example',
                                              'name' => 'propertyc'
                                            }
                                          ]
                          }
        };