2011-08-15 189 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

文本節點沒有名稱。也許你想要父母的名字?

我認爲這將工作:

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

你的代碼做的就是選擇text節點,它們以您正在查找的節點的子節點的形式存在。文本節點是一個獨立的實體,並沒有名稱。您需要導航到文本節點的父節點,並且節點將包含標記名稱。

事情變得與包含文本和元素節點的混合內容節點棘手,如

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

在這種情況下,結構

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

「混合內容節點」不應該成爲問題。大多數XML格式不允許這樣的層次結構。 XHTML是我見過的許多許多人中唯一的。 – ikegami