Perl XML :: LibXML:如何访问注释节点

时间:2013-10-17 16:28:30

标签: perl libxml2 xml-libxml

对于我的生活,我无法弄清楚访问XML文件中注释行的正确代码。我是否使用findnodesfindgetElementByTagName(怀疑)。

我是否正确地假设这些评论行是可访问的?我希望如此,因为我知道我可以添加评论。

注释节点的类型编号为8,因此它们必须是可解析的。

最终,我想要做的就是删除它们。

my @nodes = $dom->findnodes("//*");

foreach my $node (@nodes) {
  print $node->nodeType, "\n";
}

<TT>
 <A>xyz</A>
 <!-- my comment -->
</TT> 

3 个答案:

答案 0 :(得分:9)

  • 如果你需要做的就是删除注释节点的XML副本,那么toStringC14N的第一个参数就是一个标志,表示你是否想在输出中注释。省略所有参数隐式地将第一个设置为假值,所以

    $doc->toStringC14N
    

将重现修剪过的XML注释。 请注意,C14N指定的Canonical XML表单不包含XML声明标头。它始终是以UTF-8编码的XML 1.0。

  • 如果您需要在进一步处理之前从文档的内存结构中删除注释,那么带有XPath表达式findnodes的{​​{1}}将为您找到它们,{{1}将从XML中删除它们。

该程序演示

//comment()

<强>输出

unbindNode



<强>更新

要选择特定的注释,可以将谓词表达式添加到XPath选择器。要在示例数据中查找特定注释,您可以编写

use strict;
use warnings;

use XML::LibXML;

my $doc = XML::LibXML->load_xml(string => <<END_XML);
<TT>
 <A>xyz</A>
 <!-- my comment -->
</TT>
END_XML

# Print everything
print $doc->toString, "\n";

# Print without comments
print $doc->toStringC14N, "\n\n";

# Remove comments and print everything
$_->unbindNode for $doc->findnodes('//comment()');
print $doc->toString;

注意 评论文字包含所有内容,但前导和尾随<?xml version="1.0"?> <TT> <A>xyz</A> <!-- my comment --> </TT> <TT> <A>xyz</A> </TT> <?xml version="1.0"?> <TT> <A>xyz</A> </TT> 除外,因此空格很重要,如图所示在那个电话里。

如果你想让事情变得更加松懈,你可以使用$doc->findnodes('//comment()[. = " my comment "]') 来删除前导空格和尾随空格,并将字符串中的每个空格序列收缩到一个空格。现在你可以写

--

即使看起来像这样,同一个电话也会找到你的评论。

normalize=space

最后,您可以使用$doc->findnodes('//comment()[normalize-space(.) = "my comment"]') ,正如您所期望的那样,只需检查一个字符串是否包含另一个字符串。使用它你可以写

<!--
my
comment
-->

选择的人取决于您的要求和您的情况。

答案 1 :(得分:8)

根据XPath规范:

  • *是一个匹配任何名称的元素节点的测试。注释节点不是元素节点。

  • comment()是一个匹配评论节点的测试。

未测试:

for $comment_node ($doc->findnodes('//comment()')) {
   $comment_node->parentNode->removeChild($comment_node);
}

答案 2 :(得分:2)

我知道它不是XML::LibXML但是您可以通过XML::Twig模块轻松删除评论:

#!/usr/bin/env perl

use warnings;
use strict;
use XML::Twig;

my $twig = XML::Twig->new(
    pretty_print => 'indented',
    comments => 'drop'
)->parsefile( shift )->print;

像以下一样运行:

perl script.pl xmlfile

产量:

<TT>
  <A>xyz</A>
</TT>

comments选项还具有值process,可让您使用xpath #COMMENT值来处理它们。