まず、すべての返信者に感謝します。今、私は実際のタスクの実際の詳細を提供する必要があると感じています.
次のような一連の要素を含む 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>
elementsは (クラス->getChildNodes
のオブジェクトへの) 参照を 1 つだけ含むリストを返しますが、forは空のリストを返します。とで値を取得する必要がありますが、テキスト要素がないため、結果のハッシュに配置する必要があります。XML::DOM::Text
<attr_3>
<attr_1>
<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;
}