2011-08-15 12 views
1

LIBXML - タグの名前はどのように取得できますか?私は、次のしている

my $string='<entry><name>Bob</name><zip>90210</zip></entry>'; 

my $parser=XML::LibXML->new(); 
use HTML::Entities; 
my $encodedXml=encode_entities($string,'&\''); 

my $doc=$parser->parse_string($encodedXml); 

foreach my $text($doc->findnodes("//text()")){ 
print $text->to_literal,"\n"; 
} 

これは 'ボブ' と '90210' を出力します。私は、実際のノード名を取得しない...私は、XMLツリー内のすべてのノードを取得する方法を必要とするどのよう

....すなわち、「名前」と「郵便番号」

答えて

6

テキストノードは名前を持っていない。この場合のような

<p>Beginning of <i>sentence</i> and now the end</p> 

で、両方のテキストおよび要素ノードを含む混合コンテンツノードとトリッキー取得します。おそらくあなたは親の名前が欲しいのですか?

私はこれがうまくいくと思う:

for my $node ($doc->findnodes('//text()')) { 
    print $node->parentNode()->nodeName(), ": ", $node->nodeValue(), "\n"; 
} 

私は

for my $node ($doc->findnodes('//*[text()]')) { 
    print $node->nodeName(), ": ", $node->textContent(), "\n"; 
} 

注意を使用します。これ以降のバージョンでは、要素のすべてのテキストの子を組み合わせて、そのノードがより多くを持っている場合、それは等価ではありません1つのテキストの子より。彼らはあなたと同等でなければなりません。

1

何あなたのコードがすることは選択でありますtextノードは、探しているノードの子として存在します。テキストノードは別のエンティティであり、名前はありません。テキストノードの親ノードに移動する必要があります。には、ノードにタグ名が含まれます。

物事は構造が

<p> 
| 
+---text (Beginning of) 
| 
+---<i> 
| | 
| +---text (sentence) 
| 
+---text (and now the end) 
+0

"混在コンテンツノード"は問題ではありません。ほとんどのXML形式では、このような階層は許可されません。 XHTMLは私が見た多くの多くの唯一のものです。 – ikegami

関連する問題