我已经尝试过XML Simple
,但是由于它只是将 XML 读入哈希,因此在针对 DTD 运行时输出是无用的。艰难地学会了它。
所以我采用了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>
who's Name
is 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>
包含照片和/或海报的那些(和所有孩子)怎么办?