在我的一生中,我无法找出正确的代码来访问我的 XML 文件中的注释行。我是否使用 findnodes , find , getElementByTagName (怀疑)。

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

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

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

my @nodes = $dom->findnodes("//*"); 
 
foreach my $node (@nodes) { 
  print $node->nodeType, "\n"; 
} 
 
<TT> 
 <A>xyz</A> 
 <!-- my comment --> 
</TT>  

请您参考如下方法:

  • 如果您需要做的只是生成删除注释节点的 XML 副本,那么 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")]') 
    

    选择哪一种取决于您的要求和您的情况。


    评论关闭
    IT干货网

    微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!