我已经提供了一个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);
?
答案 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'
}
]
}
};