这是我的XML数据
<categories>
<category id="Id001" name="Abcd">
<project> ID_1234</project>
<project> ID_5678</project>
</category>
<category id="Id002" name="efgh">
<project> ID_6756</project>
<project> ID_4356</project>
</category>
</categories>
我需要根据包含<project>
元素的name
属性获取每个<category>
元素的文本内容。
我正在使用Perl和XML::LibXML
模块。
例如,根据类别名称Abcd
,我应该获得列表ID_1234
,ID_5678
。
这是我的代码
my $parser = XML::LibXML->new;
$doc = $parser->parse_file( "/cctest/categories.xml" );
my @nodes = $doc->findnodes( '/categories/category' );
foreach my $cat ( @nodes ) {
my @catn = $cat->findvalue('@name');
}
这为我提供了数组@catn
中的类别名称。但是如何获取每个项目的文本值?
答案 0 :(得分:3)
您还没有展示到目前为止您尝试过的内容,或者您想要的输出是什么,所以我猜测了您正在寻找的内容。
使用XML::Twig
,您可以执行以下操作:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig -> parse ( \*DATA );
foreach my $project ( $twig -> findnodes ( '//project' ) ) {
print join ",", (map { $project -> parent -> att($_) } qw ( id name )), $project -> text,"\n";
}
__DATA__
<categories>
<category id="Id001" name="Abcd">
<project> ID_1234</project>
<project> ID_5678</project>
</category>
<category id="Id002" name="efgh">
<project> ID_6756</project>
<project> ID_4356</project>
</category>
</categories>
产生:
Id001,Abcd, ID_1234,
Id001,Abcd, ID_5678,
Id002,efgh, ID_6756,
Id002,efgh, ID_4356,
通过使用findnodes
找到任何元素&#39; project&#39;来实现此目的。
然后提取&#39; id&#39;和&#39; name&#39;来自父级(类别)的属性,并打印该属性以及此特定元素中的文本。
xpath
是一个从XML
中选择数据的强大工具,我们可以提供更具体的答案。
所以,如果你正在寻找所有项目&#39; under&#39;类别&#34; Abcd&#34;你可以:
foreach my $project ( $twig -> findnodes ( './category[@name="Abcd"]/project' ) ) {
print $project -> text,"\n";
}
答案 1 :(得分:0)
这使用XML :: LibXML,它是您已经使用的库。
您的$cat
变量包含一个XML元素对象,您可以使用在顶级findnodes()
对象上使用的相同findvalue()
和$doc
方法处理这些对象。< / p>
#!/usr/bin/perl
use strict;
use warnings;
# We use modern Perl here (specifically say())
use 5.010;
use XML::LibXML;
my $doc = XML::LibXML->new->parse_file('categories.xml');
foreach my $cat ($doc->findnodes('//category')) {
say $cat->findvalue('@name');
foreach my $proj ($cat->findnodes('project')) {
say $proj->findvalue('.');
}
}
答案 2 :(得分:-1)
您可以尝试使用XML::Simple
use strict;
use warnings;
use XML::Simple;
use Data::Dumper
my $XML_file = 'your XML file';
my $XML_data;
#Get data from your XML file
open(my $IN, '<:encoding(UTF-8)', $XML_file) or die "cannot open file $XML_file";
{
local $/;
$XML_data = <$IN>;
}
close($IN);
#Store XML data as hash reference
my $xmlSimple = XML::Simple->new(KeepRoot => 1);
my $hash_ref = $xmlSimple->XMLin($XML_data);
print Dumper $hash_ref;
哈希引用如下:
$VAR1 = {
'categories' => {
'category' => {
'efgh' => {
'id' => 'Id002',
'project' => [
' ID_6756',
' ID_4356'
]
},
'Abcd' => {
'id' => 'Id001',
'project' => [
' ID_1234',
' ID_5678'
]
}
}
}
};
现在获取您想要的数据:
foreach(@{$hash_ref->{'categories'}->{'category'}->{'Abcd'}->{'project'}}){
print "$_\n";
}
结果是:
ID_1234
ID_5678