Я пытаюсь разобрать файл XML
-like со следующей структурой:Разбор XML-файл с Perl XMLSimple
Edit: я попытался опустить большую часть огромного файла XML, чтобы упростить все, но с/p-ed ошибочно. Вот полный файл (900Kb!), Что на самом деле имеет этот вопрос: https://docs.google.com/file/d/0B3ustNI1qZh1UURrYWZJQk0wVlU/edit?usp=sharing
<CIM CIMVERSION="2.0" DTDVERSION="2.0">
<DECLARATION>
<DECLGROUP>
<LOCALNAMESPACEPATH>
<NAMESPACE NAME="signalingsystem"/>
</LOCALNAMESPACEPATH>
<VALUE.OBJECT>
<INSTANCE CLASSNAME="SharedGtTranslator">
<PROPERTY NAME="Name" TYPE="string">
<VALUE>AUC$4,1,6,4,26202*-->AUC RemoteSPC: 300 SSN: 10</VALUE>
</PROPERTY>
<PROPERTY NAME="NatureOfAddress" TYPE="sint32">
<VALUE>4</VALUE>
</PROPERTY>
</INSTANCE>
</VALUE.OBJECT>
<VALUE.OBJECT>
<INSTANCE CLASSNAME="SharedGtTranslator">
<PROPERTY NAME="Name" TYPE="string">
<VALUE>AUC$4,2,6,4,26202*-->AUC AUC LocalSPC: 410 SSN: 10</VALUE>
</PROPERTY>
<PROPERTY NAME="NatureOfAddress" TYPE="sint32">
<VALUE>4</VALUE>
</PROPERTY>
<VALUE>2</VALUE>
</PROPERTY>
</INSTANCE>
</VALUE.OBJECT>
</DECLGROUP>
</DECLARATION>
</CIM>
Я использую XMLSimple разобрать эту структуру. Мне нужно получить все Ценности для НЕДВИЖИМОСТИ NAME="Name"
, если CLASSNAME="SharedGtTranslator"
.
Это то, что я пытаюсь сделать:
#!/usr/bin/perl
use strict;
use warnings;
# use module
use XML::Simple;
use Data::Dumper;
my $file1 = $ARGV[0];
# create object
my $xml = new XML::Simple;
# read XML file
my $data = $xml->XMLin($file1);
foreach my $object (@{$data->{DECLARATION}->{DECLGROUP}->{'VALUE.OBJECT'}}) {
if ($object->{INSTANCE}->{CLASSNAME} eq 'SharedGtTranslator') {
foreach my $property (@{$object->{INSTANCE}->{PROPERTY}}) {
if ($property->{NAME} eq 'Name') {
print $property->{VALUE} . "\n";
}
}
}
}
Получение
"Псевдо-хэши являются устаревшими"
и ничего не происходит.
Справка высоко оценена!
В вашем XML отсутствует тег PROPERTY. Когда я исправил это, код, который вы предоставили, работает, за исключением неинициализированного предупреждения. – TLP
На самом деле это была ошибка с моей стороны. Я попытался пропустить большую часть огромного xml-файла, чтобы упростить все, кроме c/p-ed, неправильно. Вот полный файл (900kb!): Https://docs.google.com/file/d/0B3ustNI1qZh1UURrYWZJQk0wVlU/edit?usp=sharing – vobelic
Криптографическое сообщение «Псевдо-хеши устарело» возникает, когда вы пытаетесь индексировать массив arrayref как будто это был хэш. Я рекомендую краткий, но информативный [Справочник по ссылкам Perl] (http://perldoc.perl.org/perlreftut.html). Я также согласен с рекомендацией @ Borodin использовать XML :: LibXML. –