XML::LibXML:如何使用 find 获取数字/布尔对象?

发布于 2024-09-02 14:34:34 字数 1231 浏览 4 评论 0原文

来自 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' );

输出

删除

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

find evaluates the XPath 1.0 expression using the current node as the context of the expression, and returns the result depending on what type of result the XPath expression had. For example, the XPath "1 * 3 + 52" results in a XML::LibXML::Number object being returned. Other expressions might return a XML::LibXML::Boolean object, or a XML::LibXML::Literal object (a string).

I suppose in my example the find returns a XML::LibXML::Literal object (a string). Could someone show me examples where find returns a XML::LibXML::Number object resp. a XML::LibXML::Boolean object?

#!/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' );

outputs

delete

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

多像笑话 2024-09-09 14:34:34
$root -> find ("number(//files/age[@units = 'hours']"))
$root -> find ("number(//files/age[@units = 'hours']"))
后eg是否自 2024-09-09 14:34:34

您的脚本会打印 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

Your script prints delete because the objects returned by find overload the stringification operator "". The object returned is actually an XML::LibXML::NodeList. For example, the following

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

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

prints

delete
XML::LibXML::NodeList
2
XML::LibXML::Number
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文