gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:27:24 29 4
gpt4 key购买 nike

在我的一生中,我无法找出正确的代码来访问我的 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")]')

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

    关于Perl XML::LibXML:如何访问注释节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19432252/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com