Perl XML:: LibXML: findnode против findvalue против find - в чем разница?

я использую XML::LibXML, и мне просто нужно получить количество узлов, указанных выражением XPath.

использование любой из первых двух строк кода ниже дает то, что я ищу. Я могу использовать count функция XPath с findvalue или find а не 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!

что приводит меня к общему придирчивому вопросу: Какая разница между этими тремя!--5--> типы? В документация, в ней говорится:

$string = $node->findvalue($xpath)
$result = $node->find($xpath)
@nodes  = $node->findnodes($xpath_expression)
  1. действительно ли есть разница между аргументом $xpath_expression и просто $xpath в документации?

  2. для двух, возвращающих скаляр, какая разница?

Я пытаюсь понять значение использования одного типа поиска над другим-Спасибо!

1 ответов


разница-это тип значения, которое возвращают методы.

  • findnodes используется для получения списка узлов. Если метод вызывается в контексте списка он возвращает список объектов соответствующего типа, таких как XML::LibXML::Element, XML::LibXML::Text etc. Если он вызывается в скалярном контексте, то он возвращает single XML::LibXML::NodeList объект, содержащий ту же информацию.

    это не может используется для возврата произвольного выражения, для пример $dom->findnodes('42') ничего не вернуть. Из этого метода можно получить только узлы документа списка.

  • findvalue используется для возврата одного текста или цифры стоимостью, т. е. не узел XML. Если передать выражение XPath, которое вычисляется в список узлов, он преобразует этот список в текст путем объединения всех текстовых узлов в любом из узлов в списке.

  • find может вернуть что угодно. Он вернет узел список как в выражении, которое оценивается в список узлов, то есть смутно разумный способ преобразования в текстовое значение и findvalue делает все возможное и возвращает конкатенацию всех текстовых узлов, содержащихся узлов в списке.