2014-12-19 3 views
3

я дал файл XSD, в Perl Enviroment и может использовать только XML::LibXML , XML::SAX, XML::CompileПрикрепление метки или нескольких тегов в XML :: COMPILE :: SCHEMA

Соответствующая часть из 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->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);  

Моя проблема сейчас есть, я не могу видеть способ, как я могу добавить более одного свойства тега с somesing как

@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

похоже, что свойство является анонимным массивом, содержащим анонимные хеши. Не могли бы вы использовать ваш цикл foreach для создания массива, а затем создать свой xml, предоставив ему ссылку на массив свойств? –

ответ

1

Значение свойства в вашем хэше - это просто ссылка на анонимный массив/массив. Таким образом, вы можете просто обработать свои свойства в парах значений имен в цикле foreach и направить их на массив. Затем вам нужно только создать хэш хеша один раз и дать ему ссылку на массив реквизита, который вы создали в цикле foreach.

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' 
              } 
              ] 
          } 
     }; 
+0

Спасибо. Но, видя это правильно, нет возможности прикреплять теги после выполнения my $ xml = $ write -> ($ doc, $ hash); $ doc-> setDocumentElement ($ xml); ? Во всяком случае, после некоторых фитингов это получилось, оцените вашу помощь :) – chenino