将重现 XML 修剪的评论。请注意,C14N 指定的规范 XML 格式不包括 XML 声明头。它总是以 UTF-8 编码的 XML 1.0。
- 如果您需要在进一步处理之前从文档的内存结构中删除注释,那么
findnodes
XPath 表达式//comment()
将为您找到它们,unbindNode
并将它们从 XML 中删除。
这个程序演示
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>
更新
要选择特定注释,您可以将谓词表达式添加到 XPath 选择器。要在示例数据中查找特定评论,您可以编写
$doc->findnodes('//comment()[. = " my comment "]')
请注意,注释的文本包括除前导和尾随之外的--
,因此空格很重要,如该调用所示。
如果你想让事情变得更宽松一些,你可以使用normalize=space
,它删除前导和尾随空格,并将字符串中的每个空格序列压缩为一个空格。现在你可以写
$doc->findnodes('//comment()[normalize-space(.) = "my comment"]')
即使看起来像这样,同一个电话也会找到您的评论。
<!--
my
comment
-->
最后,您可以使用contains
,正如您所期望的,它只是检查一个字符串是否包含另一个字符串。使用它你可以写
$doc->findnodes('//comment()[contains(., "comm")]')
选择哪一种取决于您的要求和您的情况。