【发布时间】:2021-07-13 08:33:30
【问题描述】:
对于下面的 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 而不是
XML::Simple。 -
@vkk05 是的,我知道总是建议使用 LibXML,尽管我无法在 LibXML 中找到任何可以帮助我像上面那样转换它的特定属性/函数。如果您能对如何使用 LibXML 进行一些说明,我将不胜感激。
-
您也没有找到使用 XML::Simple 的方法... XML 不能很好地映射到哈希/数组。你需要说如何做到这一点。 XML::Simple 不允许您这样做,因此模块自己的文档中的警告告诉您不要使用它。说真的,当模块本身告诉你不要使用模块时,你为什么要使用模块?!
-
@ikegami 这就是我发布这个问题的原因。我发现了一些非常相似的东西:stackoverflow.com/questions/27328986/… 虽然如果你看一下哈希,在 func 中有一个列表,它是通过 XML:Simple 中的 ForceArray 参数实现的,XMLLib 中是否有类似的东西?
-
您只认为 XML::Simple 有效。一段时间后,它将无法满足您的需求。例如,您无法可靠地往返数据。文档告诉你这一点。但是,正如 ikegami 所指出的,您只是告诉我们您认为解决方案是什么,而没有就实际问题发表任何意见。