LIBXML - 如何获取标签的名称?

时间:2011-08-15 02:11:49

标签: xml perl libxml2

我有以下内容:

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";
}

打印出'Bob'和'90210';

如何获取实际的节点名称...我需要一种方法来获取我的xml树中的所有节点....即'name'和'zip'

2 个答案:

答案 0 :(得分: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 :(得分: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)