2013-04-23 2 views
1

У меня возникли проблемы с созданием того, что я считаю hashref (href) в perl с XML :: Simple. Я новичок в этом, поэтому не уверен, как это сделать, и я не могу найти много, чтобы построить этот href с массивами. Все примеры, которые я нашел, предназначены для нормального href.Как построить hashref с массивами в perl?

Код ниже выводит правильный XML немного, но я действительно изо всех сил о том, как добавить еще к этому HREF

Благодаря Дарио

use XML::Simple; 
$test = { 
book => [ 
    { 
     'name' => ['createdDate'], 
     'value' => [20141205] 
    }, 
     { 
     'name' => ['deletionDate'], 
     'value' => [20111205] 
    }, 

] 

}; 
$test ->{book=> [{'name'=> ['name'],'value'=>['Lord of the rings']}]}; 
print XMLout($test,RootName=>'library'); 

ответ

2

Чтобы добавить новый хэш в arrary-исх «books», вам нужно передать массив-ref в массив, а затем нажать на него. @{ $test->{book} } преобразует массив-ref в массив.

push @{ $test->{book} }, { name => ['name'], value => ['The Hobbit'] }; 
+0

Большое спасибо, что работал лакомство :) – beastofbobmin

1

XML::Simple является боль, потому что вы никогда не уверены, нужно ли массив или хэш, и это трудно различать между элементами и атрибутами.

Предлагаю совершить переход на XML::API. Эта программа демонстрирует, как она будет использоваться для создания тех же данных XML, что и ваша собственная программа, которая использует XML::Simple.

У этого есть преимущество, потому что он создает структуру данных в памяти, которая правильно представляет XML. Данные можно добавить линейно, например, или сохранить закладки в структуре и вернуться назад и добавить информацию к узлам, созданным ранее.

Этот код добавляет два элемента book по-разному. Первый - это стандартный способ, при котором элемент открывается, добавляются элементы name и value, а элемент book снова закрывается. Второй показывает метод _ast (абстрактное синтаксическое дерево), который позволяет передавать данные в вложенных массивах, аналогичных тем, что указаны в XML::Simple для краткости. Эта структура требует от вас присвоить имена атрибутов дефисом -, чтобы отличить их от имен элементов.

use strict; 
use warnings; 

use XML::API; 

my $xml = XML::API->new; 

$xml->library_open; 

$xml->book_open; 
$xml->name('createdDate'); 
$xml->value('20141205'); 
$xml->book_close; 

$xml->_ast(book => [ 
    name => 'deletionDate', 
    value => '20111205', 
]); 

$xml->library_close; 

print $xml; 

выход

<?xml version="1.0" encoding="UTF-8" ?> 
<library> 
    <book> 
    <name>createdDate</name> 
    <value>20141205</value> 
    </book> 
    <book> 
    <name>deletionDate</name> 
    <value>20111205</value> 
    </book> 
</library> 
Смежные вопросы