XML :: LibXML: Как получить Number / Boolean-объект с помощью find? - PullRequest
0 голосов
/ 18 мая 2010

С http://metacpan.org/pod/XML::LibXML::Node:

find оценивает выражение XPath 1.0, используя текущий узел в качестве контекста выражения, и возвращает результат в зависимости от того, какой тип результата имел выражение XPath. Например, XPath «1 * 3 + 52» приводит к возвращению объекта XML :: LibXML :: Number. Другие выражения могут возвращать объект XML :: LibXML :: Boolean или объект XML :: LibXML :: Literal (строка).

Я полагаю, что в моем примере find возвращает объект XML :: LibXML :: Literal (строка). Может ли кто-нибудь показать мне примеры, когда find возвращает объект XML :: LibXML :: Number соотв. объект XML :: LibXML :: Boolean?

#!/usr/bin/env perl
use warnings; use strict;
use 5.012;
use XML::LibXML;

my $xml_string =<<EOF;
<?xml version="1.0" encoding="UTF-8"?>
<filesystem>
   <path>
     <dirname>/var</dirname>
     <files>
       <action>delete</action>
       <age units="days">10</age>
     </files>
     <files>
       <action>delete</action>
       <age units="hours">96</age>
     </files>
   </path>
</filesystem>
EOF
#/

my $doc = XML::LibXML->load_xml( string => $xml_string );
my $root = $doc->documentElement;

say $root->find( '//files[1]/action' );

выходы

удалить

Ответы [ 2 ]

1 голос
/ 17 октября 2013

Ваш скрипт печатает delete, потому что объекты, возвращаемые find, перегружают оператор строкового преобразования "". Возвращенный объект на самом деле XML::LibXML::NodeList. Например, следующее

my $result = $root->find( '//files[1]/action' );
say $result;
say ref($result);

$result = $root->find( 'count(//files)' );
say $result;
say ref($result);

печать

delete
XML::LibXML::NodeList
2
XML::LibXML::Number
1 голос
/ 18 мая 2010
$root -> find ("number(//files/age[@units = 'hours']"))
...