1

私は Perl を使用していくつかの XML 解析を行っており、XML::DOMに決定しました。以下を含むファイルを解析しているとします。

<document>
   <A>
      <B/>
      <B/>
   </A>
   <B/>
</document>

「B」要素は、ドキュメント内の相対的な位置に応じて異なる方法で処理されます (つまり、親が A である B は、親がドキュメントである B とは異なります)。ドキュメント ノードへの参照から、直接の子である B を取得することは可能ですか。その後、A ノードへの参照を取得して、その子 B のみを取得しますか?

ありがとう、

アンドリュー

4

2 に答える 2

4

別のアイデアは、XML::DOM::XPathをロードすることです。これにより、これらの種類のクエリが非常に自然になり、冗長性が大幅に軽減されます。

document 要素の子である B ノード:

@nodes = $doc->findnodes('/document/B');

ドキュメントの子である A ノードの子である B ノード:

@nodes = $doc->findnodes('/document/A/B');

どこでも発生する A ノードの直接の子である B ノード:

@nodes = $doc->findnodes('//A/B');

任意の A ノードの子孫である B ノード:

@nodes = $doc->findnodes('//A//B');

それらとドキュメントの間に任意の 1 つ (正確に 1 つ) の祖先を持つ B ノード:

@nodes = $doc->findnodes('/document/*/B');

そして、もっとたくさん!(あなたの問題に最も適したオプションが正確にどれであるかがあなたの質問から明確ではないので、私はそこに多くのオプションを投げました)。

すべての値は、いくつかのメソッドが追加された通常の XML::DOM オブジェクトであるため、既存の XML::DOM コードとほとんど問題なく組み合わせることができます。

于 2010-12-13T05:05:54.663 に答える
2

すべての B 要素がドキュメントまたは A のいずれかの子になることがわかっていると仮定すると、オプションの recurse パラメータをgetElementsByTagNameに使用できます。0 を渡すと、直接の子要素のみが返されます。

my @docB = $doc->getElementsByTagName('B', 0);
# do something with @docB

for my $aNode ($doc->getElementsByTagName('A')) {
  my @AB = $aNode->getElementsByTagName('B', 0);
  # do something with @AB
}
于 2010-12-13T01:25:47.263 に答える