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