将 XML 转换为 Perl 哈希
Convert XML to Perl Hash
对于下面的 XML 结构,我正在尝试获取相应的 Perl Hash 数组
<root>
<ref name="abc_sia_%version1.ref%">
<func envname = "test01" objectdir = "/home/pv66" base="default_771"/>
</ref>
</root>
我可以使用以下方法将其转换为 perl 哈希:
my $xml = new XML::Simple;
my $data = $xml->XMLin("/home/pv66", ForceArray => 1, KeyAttr => { ref => "name"});
print Dumper ($data);
哈希结果是:
$VAR1 = {
'ref' => {
'abc_sia_%version1.ref' => {
'func' => [
{
'envname' => 'test01',
'objectdir' => '/home/pv66',
'base' => 'default_771'
}
]
}
}
};
虽然我需要删除上面的引用,但基本上我希望散列看起来像:
$VAR1 = {
'abc_sia_%version1.ref' => {
'func' => [
{
'envname' => 'test01',
'objectdir' => '/home/pv66',
'base' => 'default_771'
}
]
}
};
有什么方法可以转换哈希值吗??
改为 XML::LibXML can be a bit terse for beginners. I recommend Grant's tutorial 的文档。
XML::LibXML 没有一个单独的“从这个 XML 文档创建数据结构”的方法。正如 XML::Simple 所示,该方法太脆弱而无用。相反,您可以自己走 DOM 以将所需的任何数据提取到数据结构中。就个人而言,我喜欢使用 XPath 表达式来确定我想要的内容。
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use Data::Dumper;
use XML::LibXML;
# Here, I've loaded the XML from the DATA filehandle
# (at the end of the source file). Other options are
# available.
my $dom = XML::LibXML->load_xml(IO => \*DATA);
my $data;
# Look for all '/root/ref' nodes...
for my $ref ($dom->findnodes('/root/ref')) {
# Get the name of the ref node
my $key = $ref->findvalue('./@name');
my @funcs;
# Look for all of the 'func' nodes below this ref node
for my $func ($ref->findnodes('./func')) {
my $func_data;
# For each attribute we're interested in...
for (qw[envname objectdir base]) {
# Get the value of the attribute
$func_data->{$_} = $func->findvalue("./\@$_");
}
push @funcs, $func_data;
}
$data->{$key}{func} = \@funcs;
}
say Dumper $data;
__DATA__
<root>
<ref name="abc_sia_%version1.ref%">
<func envname = "test01" objectdir = "/home/pv66" base="default_771"/>
</ref>
</root>
原来我所要做的就是添加另一个搜索级别并将其分配给一个变量。无论如何我都会发布解决方案:
my $xml = new XML::Simple;
my $data = $xml->XMLin("/home/pv66", ForceArray => 1, KeyAttr => { ref => "name"});
my data1 = $data->{'ref'};
print Dumper ($data1);
这个returns:
$VAR1 = {
'abc_sia_%version1.ref' => {
'func' => [
{
'envname' => 'test01',
'objectdir' => '/home/pv66',
'base' => 'default_771'
}
]
}
};
这就是我想要的结构。
对于下面的 XML 结构,我正在尝试获取相应的 Perl Hash 数组
<root>
<ref name="abc_sia_%version1.ref%">
<func envname = "test01" objectdir = "/home/pv66" base="default_771"/>
</ref>
</root>
我可以使用以下方法将其转换为 perl 哈希:
my $xml = new XML::Simple;
my $data = $xml->XMLin("/home/pv66", ForceArray => 1, KeyAttr => { ref => "name"});
print Dumper ($data);
哈希结果是:
$VAR1 = {
'ref' => {
'abc_sia_%version1.ref' => {
'func' => [
{
'envname' => 'test01',
'objectdir' => '/home/pv66',
'base' => 'default_771'
}
]
}
}
};
虽然我需要删除上面的引用,但基本上我希望散列看起来像:
$VAR1 = {
'abc_sia_%version1.ref' => {
'func' => [
{
'envname' => 'test01',
'objectdir' => '/home/pv66',
'base' => 'default_771'
}
]
}
};
有什么方法可以转换哈希值吗??
改为 XML::LibXML can be a bit terse for beginners. I recommend Grant's tutorial 的文档。
XML::LibXML 没有一个单独的“从这个 XML 文档创建数据结构”的方法。正如 XML::Simple 所示,该方法太脆弱而无用。相反,您可以自己走 DOM 以将所需的任何数据提取到数据结构中。就个人而言,我喜欢使用 XPath 表达式来确定我想要的内容。
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use Data::Dumper;
use XML::LibXML;
# Here, I've loaded the XML from the DATA filehandle
# (at the end of the source file). Other options are
# available.
my $dom = XML::LibXML->load_xml(IO => \*DATA);
my $data;
# Look for all '/root/ref' nodes...
for my $ref ($dom->findnodes('/root/ref')) {
# Get the name of the ref node
my $key = $ref->findvalue('./@name');
my @funcs;
# Look for all of the 'func' nodes below this ref node
for my $func ($ref->findnodes('./func')) {
my $func_data;
# For each attribute we're interested in...
for (qw[envname objectdir base]) {
# Get the value of the attribute
$func_data->{$_} = $func->findvalue("./\@$_");
}
push @funcs, $func_data;
}
$data->{$key}{func} = \@funcs;
}
say Dumper $data;
__DATA__
<root>
<ref name="abc_sia_%version1.ref%">
<func envname = "test01" objectdir = "/home/pv66" base="default_771"/>
</ref>
</root>
原来我所要做的就是添加另一个搜索级别并将其分配给一个变量。无论如何我都会发布解决方案:
my $xml = new XML::Simple;
my $data = $xml->XMLin("/home/pv66", ForceArray => 1, KeyAttr => { ref => "name"});
my data1 = $data->{'ref'};
print Dumper ($data1);
这个returns:
$VAR1 = {
'abc_sia_%version1.ref' => {
'func' => [
{
'envname' => 'test01',
'objectdir' => '/home/pv66',
'base' => 'default_771'
}
]
}
};
这就是我想要的结构。