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)
действительно ли есть разница между аргументом
$xpath_expression
и просто$xpath
в документации?для двух, возвращающих скаляр, какая разница?
Я пытаюсь понять значение использования одного типа поиска над другим-Спасибо!
1 ответов
разница-это тип значения, которое возвращают методы.
-
findnodes
используется для получения списка узлов. Если метод вызывается в контексте списка он возвращает список объектов соответствующего типа, таких какXML::LibXML::Element
,XML::LibXML::Text
etc. Если он вызывается в скалярном контексте, то он возвращает singleXML::LibXML::NodeList
объект, содержащий ту же информацию.это не может используется для возврата произвольного выражения, для пример
$dom->findnodes('42')
ничего не вернуть. Из этого метода можно получить только узлы документа списка. findvalue
используется для возврата одного текста или цифры стоимостью, т. е. не узел XML. Если передать выражение XPath, которое вычисляется в список узлов, он преобразует этот список в текст путем объединения всех текстовых узлов в любом из узлов в списке.-
find
может вернуть что угодно. Он вернет узел список как в выражении, которое оценивается в список узлов, то есть смутно разумный способ преобразования в текстовое значение иfindvalue
делает все возможное и возвращает конкатенацию всех текстовых узлов, содержащихся узлов в списке.