gpt4 book ai didi

Perl XML::LibXML: findnode vs. findvalue vs. find - 有什么区别?

转载 作者:行者123 更新时间:2023-12-03 15:22:55 36 4
gpt4 key购买 nike

我正在使用 XML::LibXML ,我只需要获取 XPath 表达式指定的节点数。

使用下面的前两个代码行中的任何一个都会产生我正在寻找的内容。我可以使用 count XPath 函数与 findvaluefind但不是 findnodes (是的,我知道,因为它返回一个列表)。

my $node_cnt = $dom->findvalue("count($xpath_str)");  # WORKS!
my $node_cnt = $dom->find("count($xpath_str)"); # WORKS!
my @node_cnt = $dom->findnodes("count($xpath_str)"); # count doesn't work!

这导致我提出一个普遍的唠叨问题:
三个有什么区别 find类型?在文档中,它说:
$string = $node->findvalue($xpath)
$result = $node->find($xpath)
@nodes = $node->findnodes($xpath_expression)
  • 论点 $xpath_expression 之间真的有区别吗?与只是 $xpath在文档中?
  • 对于返回标量的两个,有什么区别?

  • 我试图了解使用一种查找类型而不是另一种查找类型的重要性 - 谢谢!

    最佳答案

    不同之处在于方法返回的值的类型。

  • findnodes用于返回节点列表。如果在列表上下文中调用该方法,则它返回适当类型的对象列表,例如 XML::LibXML::Element , XML::LibXML::Text等等。如果在标量上下文中调用它,则返回单个 XML::LibXML::NodeList包含相同信息的对象。

    它不能用于返回任意表达式,例如 $dom->findnodes('42')不会返回任何东西。您只能从此方法获取列表文档节点。
  • findvalue用于返回单个文本或数值,即不是 XML 节点。如果您传递一个计算结果为节点列表的 XPath 表达式,那么它将通过连接列表中任何节点中的所有文本节点将该列表转换为文本。
  • find可以返回任何东西。它将返回一个节点列表作为 XML::LibXML::NodeList对象,作为 XML::LibXML::Number 的数值对象,作为 XML::LibXML::Literal 的字符串文字对象等。与 findnodes 不同,它总是返回单个标量值,即使在列表上下文中调用。

    我从来没有选择使用find .当您不知道期望什么样的结果时,它看起来像是一个包罗万象的东西。

  • 例如,你可能想写 my $nrecs = $dom->findvalue('count(/root/record)')获取根元素内的记录数。 $nrecs将是一个简单的 perl 数值。

    另一方面,要获取这些记录的列表,您可以使用 my @records = $dom->findnodes('/root/record') .现在 @records包含多个 XML::LibXML::Element对象。

    在你的例子中,
    my $node_cnt = $dom->findvalue("count($xpath_str)");  # WORKS!

    这组 $node_cnt到一个简单的 Perl 数字,而这
    my $node_cnt = $dom->find("count($xpath_str)");  # WORKS!

    $node_cntXML::LibXML::Number对象,这恰好将(当您打印它时)字符串化为与前面的语句相同。通过打印 print ref $node_cnt 自己证明这一点在这两种情况下。

    然后
    my @node_cnt = $dom->findnodes("count($xpath_str)");  # count doesn't work!

    失败,因为 XPath count计算结果为数字,而不是 XML 节点(它不是 XML 树的一部分)。无法将数字转换为节点,因此结果是一个空列表。如果是相反的情况,我们调用 findvalue在计算为节点列表的表达式上,有一种转换为文本值和 findvalue 的模糊合理的方法。尽力而为并返回列表中节点包含的所有文本节点的串联。

    关于Perl XML::LibXML: findnode vs. findvalue vs. find - 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19816644/

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