在我的一生中,我无法找出正确的代码来访问我的 XML 文件中的注释行。我是否使用 findnodes , find , getElementByTagName (怀疑)。
我是否正确假设这些评论行是可访问的?我希望如此,因为我知道我可以添加评论。
注释节点的类型编号为 8,因此它们必须是可解析的。
最终,我想做的是删除它们。
my @nodes = $dom->findnodes("//*");
foreach my $node (@nodes) {
print $node->nodeType, "\n";
}
<TT>
<A>xyz</A>
<!-- my comment -->
</TT>
请您参考如下方法:
toStringC14N 的第一个参数是一个标志,表示您是否希望在输出中添加注释。省略所有参数隐式地将第一个设置为假值,因此$doc->toStringC14N
将重现修剪过的注释的 XML。请注意,C14N 指定的规范 XML 格式不包含 XML 声明 header 。它始终是以 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")]')
选择哪一种取决于您的要求和您的情况。




