对于我的生活,我无法弄清楚访问XML文件中注释行的正确代码。我是否使用findnodes
,find
,getElementByTagName
(怀疑)。
我是否正确地假设这些评论行是可访问的?我希望如此,因为我知道我可以添加评论。
注释节点的类型编号为8,因此它们必须是可解析的。
最终,我想要做的就是删除它们。
my @nodes = $dom->findnodes("//*");
foreach my $node (@nodes) {
print $node->nodeType, "\n";
}
<TT>
<A>xyz</A>
<!-- my comment -->
</TT>
答案 0 :(得分:9)
如果你需要做的就是删除注释节点的XML副本,那么toStringC14N
的第一个参数就是一个标志,表示你是否想在输出中注释。省略所有参数隐式地将第一个设置为假值,所以
$doc->toStringC14N
将重现修剪过的XML注释。 请注意,C14N指定的Canonical XML表单不包含XML声明标头。它始终是以UTF-8编码的XML 1.0。
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
值来处理它们。