首先,非常感谢所有回复者!现在我觉得我应该提供实际任务的实际细节。
我正在解析一个包含一组元素的 XML 文件,每个看起来像这样:
<element>
<attr_1>value_1</attr_1>
<attr_2>value_2</attr_2>
<attr_3></attr_3>
</element>
我的目标是为包含以下键和值的元素创建 Perl 哈希:
('attr_1' => 'value_1',
'attr_2' => 'value_2',
'attr_3' => undef)
让我们仔细看看<attr_1>
元素。XML::DOM::Parser
CPAN
我用于解析的模块为它们创建了一个类对象XML::DOM::Element
,让我们给出名称$attr
以供参考。元素的名称很容易通过 获得$attr->getNodeName
,但要访问包含在<attr_1>
标签中的文本,首先必须接收所有<attr_1>
的子元素:
my @child_ref = $attr->getChildNodes;
for <attr_1>
and<attr_2>
元素->getChildNodes
返回一个包含一个引用(对XML::DOM::Text
类对象)的列表,而 for<attr_3>
它返回一个空列表。对于<attr_1>
and<attr_2>
我应该通过$child_ref[0]->getNodeValue
, 而对于<attr_3>
我应该undef
放入结果哈希中,因为那里没有文本元素。
因此,您会看到无法控制f
函数(现实生活中的方法)的实现 :-) 我编写的结果代码是(为子例程提供了元素、和的引用列表):->getChildNodes
XML::DOM::Element
<attr_1>
<attr_2>
<attr_3>
sub attrs_hash(@)
{
my @keys = map {$_->getNodeName} @_; # got ('attr_1', 'attr_2', 'attr_3')
my @child_refs = map {[$_->getChildNodes]} @_; # got 3 refs to list of XML::DOM::Text objects
my @values = map {@$_ ? $_->[0]->getNodeValue : undef} @child_refs; # got ('value_1', 'value_2', undef)
my %hash;
@hash{@keys} = @values;
%hash;
}