Я пробовал XML Simple
, но из-за того, что он просто считывает XML в хеш-образ, выход бесполезен при запуске против DTD. Выучил это с трудом.Использование XML :: LibXML для поиска и замены определенных частей XML-файла CableLabs 1.0
Итак, я принял XML::LibXML
, самое смешное, что было труднее всего выполнить с XML::Simple
, были самыми легкими. Однако я обнаружил, что некоторые из простых вещей, которые можно сделать в XML::Simple
, оказались невозможными (с моим недостатком понимания DOM и некоторыми путаными поведением с XML::LibXML
).
Так вот образец XML:
<Metadata>
<ADI Name="movie" />
<App_Data Name="Something I don't care about" value="who cares" />
<App_Data Name="Something I don't care about as well" value="who cares" />
<App_Data Name="ChangeMe" Value="" />
</Metadata>
<Metadata>
<ADI Name="photo" />
<App_Data Name="Something I don't care about" value="who cares" />
<App_Data Name="Something I don't care about as well" value="who cares" />
<App_Data Name="ChangeMe" Value="" />
</Metadata>
<Metadata>
<ADI Name="poster" />
<App_Data Name="Something I don't care about" value="who cares" />
<App_Data Name="Something I don't care about as well" value="who cares" />
<App_Data Name="ChangeMe" Value="" />
</Metadata>
Примечание: Я упростил это для использования в этом сообщении.
Поэтому в основном я должен использовать Name
поле в <ADI>
теге, чтобы подтвердить, что я нахожусь в правильной области DOM, чтобы внести изменения в атрибут Value
в <App_Data>
тега, кто есть Name
является ChangeMe
.
Это фрагмент кода, который я придумал ... и неудачно потерпел неудачу.
#!/usr/bin/perl
use strict;
use XML::LibXML;
my $xml2 = XML::LibXML->new();
my $data = $xml2->parse_file("adi.xml");
my $movie;
my $photo;
my $poster;
foreach my $test ($data->findnodes('//Metadata')) {
if ($test->findvalues('./ADI/@Name[.="movie"]')){
$movie = 1;
undef $photo;
undef $poster;
}
elsif ($test->findvalues('./ADI/@Name[.="photo"]')){
undef $movie;
$photo = 1;
undef $poster;
}
elsif ($test->findvalues('./ADI/@Name[.="poster"]')){
undef $movie;
undef $photo;
$poster = 1;
}
}
У меня нет ничего кроме этого, потому что это не сработает. Я получаю сообщение об ошибке что-то вдоль линий
Can't locate object method "findvalues" via package "XML::LibXML::Element"
В качестве бонуса к этому вопросу, что, если бы я хотел, чтобы полностью удалить <Metadata>
(и все дети) для тех, которые содержатся фото и/или плакат?
'UNDEF $ вар,' это специальная версия '$ Var = UNDEF;', что приводит к Perl, чтобы сделать дополнительную работу. Используйте последний. – ikegami
Непонятно, что вы намерены делать с ' ' как только вы идентифицируете тип «Метаданные». Как это будет выглядеть после изменения? –
doubleDown