Я работаю над обработкой XML-файла, полученного от партнера. Я не имею никакого влияния на изменение структуры этого XML-файла. Выдержка из XML:
<?xml version="1.0" encoding="UTF-8"?>
<objects>
<object>
<id>VW-XJC9</id>
<name>Name</name>
<type>House</type>
<description>
<![CDATA[<p>some descrioption of the house</p>]]> </description>
<localcosts>
<localcost>
<type>mandatory</type>
<name>What kind of cost</name>
<description>
<![CDATA[Some text again, different than the first tag]]>
</description>
</localcost>
</localcosts>
</object>
</objects>
Причина, по которой я использую Twig, заключается в том, что этот XML имеет размер около 11 ГБ, около 100 000 различных объектов). Проблема в том, что когда я дохожу до части localcosts, 3 поля (тип, имя и описание) пропускаются, вероятно, потому, что эти имена уже использовались ранее.
Код, который я использую для просмотра XML-файла, выглядит следующим образом:
my $twig= new XML::Twig( twig_handlers => {
id => \&get_ID,
name => \&get_Name,
type => \&get_Type,
description => \&get_Description,
localcosts => \&get_Localcosts
});
$lokaal="c:\\temp\\data3.xml";
getstore($xml, $lokaal);
$twig->parsefile("$lokaal");
sub get_ID { my( $twig, $data)= @_; $field[0]=$data->text; $twig->purge; }
sub get_Name { my( $twig, $data)= @_; $field[1]=$data->text; $twig->purge; }
sub get_Type { my( $twig, $data)= @_; $field[3]=$data->text; $twig->purge; }
sub get_Description { my( $twig, $data)= @_; $field[8]=$data->text; $twig->purge; }
sub get_Localcosts{
my ($t, $item) = @_;
my @localcosts = $item->children;
for my $localcost ( @localcosts ) {
print "$field[0]: $localcost->text\n";
my @costs = $localcost->children;
for my $cost (@costs) {
$Type =$cost->text if $cost->name eq q{type};
$Name =$cost->text if $cost->name eq q{name};
$Description=$cost->text if $cost->name eq q{description};
print "Fields: $Type, $Name, $Description\n";
}
}
$t->purge;
}
когда я запускаю этот код, основные поля читаются без проблем, но когда код достигает части «localcosts», второй цикл for-next не выполняется. Когда я меняю имена полей в xml на уникальные, этот код работает отлично.
Кто-нибудь может мне помочь?
Спасибо