2015-11-07 3 views
0

У меня есть XML-данные следующим образомPerl хэш с помощью LibXML

<type> 
    <data1>something1</data1> 
    <data2>something2</data2> 
</type> 
<type> 
    <data1>something1</data1> 
    <data2>something2</data2> 
</type> 
<type> 
    <data1>something1</data1> 
</type> 

Как можно видеть, дочерний узел data2 иногда нет.

Я использовал this в качестве ориентира, чтобы создать следующий код

my %hash; 
my $parser = XML::LibXML->new(); 
my $doc = $parser->parse_file($file_name); 
my @nodes = $doc->findnodes("/type"); 

foreach my $node(@nodes) 
{ 
    my $key = $node->getChildrenByTagName('data1'); 
    my $value = $node->getChildrenByTagName('data2'); 
    $hash{$key} = $value; 
} 

Позже, я использую этот хэш для создания еще некоторые данные, основанные на факте, если data2 дочерний узел присутствует или нет.

Я использую ne оператор в предположении, что данные в %hash являются ключевыми пары значений строк и когда data2 нет, Perl вставляет пространство как значение в хэш (я напечатал этот хэш и обнаружил, что только пространство печатается a)

Однако в итоге я получил следующие ошибки компиляции.

Operation "ne": no method found, 
     left argument in overloaded package XML::LibXML::NodeList, 
     right argument has no overloaded magic at filename.pl line 74. 

Как это решить? Какая лучшая структура данных хранит эти данные, когда мы, что иногда узел там не будет?

ответ

3

Первое, что нужно реализовать, это $value - объект XML :: LibXML :: NodeList. Это выглядит как строка, когда вы печатаете ее, потому что она перегружена. Вы можете проверить это с помощью ref $value.

С my $value = $node->getChildrenByTagName('data2');, $value будет всегда быть объектом NodeList. Это может быть пустой NodeList, но вы всегда получите объект NodeList.


Ваша версия XML :: LibXML устарела. Ваша версия XML :: LibXML :: NodeList не содержит перегрузки строк и, по умолчанию, Perl не будет «резервным», чтобы использовать строение для других строковых операторов, таких как ne. I reported this bug back in 2010 и было fixed in 2011 in version 1.77.

Обновление XML :: LibXML, и проблема исчезнет.

Как работа вокруг, вы можете принудительно форсировать, указав объект NodeList.

if("$nodelist" ne "foo") { ... } 

Но действительно, обновите этот модуль. На нем была проделана большая работа.

Perl вставляет пространство в качестве значения в хэш

Это объект NodeList stringifying. Я получаю пустую строку из пустого NodeList. Вы могли бы получить пространство как старую ошибку.

Вы также можете проверить $value->size, чтобы узнать, является ли NodeList пустым.

+0

Это объясняет это. Мне нужно будет обновить библиотеку сторонних разработчиков libXML. – Recker

+0

@Recker, это модуль Perl, который нуждается в обновлении, а не библиотеку libxml – ikegami

Смежные вопросы