【问题标题】:Getting an attribute value using Perl XPath使用 Perl XPath 获取属性值
【发布时间】:2016-04-22 09:04:45
【问题描述】:

我正在尝试在此 XML 代码上从 messaggioUtente 中提取属性 id

<?xml version="1.0" encoding="UTF-8" ?>
<?meta name="GENERATOR" content="XML::Smart/1.78 Perl/5.022001 [MSWin32]" ?>

<messaggiUtenti schemaLocation="messagiUtentiSchema.xsd">
  <messaggioUtente id="1">
    <nome>Prova Evento</nome>
    <email>example@email.com</email>
    <sitoweb>www.example.com</sitoweb>
    <messaggio>Sample</messaggio>
  </messaggioUtente>
</messaggiUtenti>

我的想法是以这种方式使用XML::XPathXML::XPath::XMLParser,但我得到的结果不正确:

my $xp = XML::XPath->new(filename => 'newfile.xml');
my $nodeset = $xp->find('//@id'); 

foreach my $node ($nodeset->get_nodelist) {

        print XML::XPath::XMLParser::as_string($node);
 }

问题是,我试图从 id 中获取整数值,而这段代码提取了整个字符串 id = "1"

您对实现这一目标有何建议?我的目标是获取 ID 号并增加它,直到我为下一个 messaggioUtente 值获得一个新的未使用 ID。 所以我的代码是这样的,但是由于字符串问题它不正确。

$id = 1;

my $xp = XML::XPath->new(filename => 'newfile.xml');
my $nodeset = $xp->find('//@id'); 

foreach my $node ($nodeset->get_nodelist) {

        my $tempvar = XML::XPath::XMLParser::as_string($node);
        if($node eq $id)
        {
            $id = $id + 1;
        } 
    }

【问题讨论】:

  • 我想你想要$node-&gt;getNodeText
  • @ikegami: No such method getNodeText in XML::XPath::Node::AttributeImpl
  • XML::XPath::XMLParser::as_string($node)一般写成$node-&gt;toString

标签: xml perl xpath


【解决方案1】:

节点集的每个元素都是一个XML::XPath::Node::Attribute 对象,它有一个getNodeValue 方法来获取节点的

按顺序获取下一个ID的最好方法是找到所有id属性的最大值,然后加一个

最好使用//messaggioUtente/@id 的XPath 表达式来避免获取任何其他元素的id 属性

此代码演示。我在您的示例数据中添加了另外两个元素,id 的值分别为 2 和 3,以更好地显示功能

use strict;
use warnings 'all';
use feature 'say';

use XML::XPath;
use List::Util 'max';

my $xp = XML::XPath->new(ioref => \*DATA);

my $ids = $xp->find('//messaggioUtente/@id');

my $new_id = 1 + max map { $_->getNodeValue } $ids->get_nodelist;

say "New ID = $new_id";

__DATA__
<?xml version="1.0" encoding="UTF-8" ?>
<?meta name="GENERATOR" content="XML::Smart/1.78 Perl/5.022001 [MSWin32]" ?>

<messaggiUtenti schemaLocation="messagiUtentiSchema.xsd">
  <messaggioUtente id="1">
    <nome>Prova Evento</nome>
    <email>example@email.com</email>
    <sitoweb>www.example.com</sitoweb>
    <messaggio>Sample</messaggio>
  </messaggioUtente>
  <messaggioUtente id="2">
    <nome>Prova Evento</nome>
    <email>example@email.com</email>
    <sitoweb>www.example.com</sitoweb>
    <messaggio>Sample</messaggio>
  </messaggioUtente>
  <messaggioUtente id="3">
    <nome>Prova Evento</nome>
    <email>example@email.com</email>
    <sitoweb>www.example.com</sitoweb>
    <messaggio>Sample</messaggio>
  </messaggioUtente>
</messaggiUtenti>

输出

New ID = 4

【讨论】:

  • 感谢您的好意和解释,我会将您的解决方案添加到我的脚本中!我试图查看这个库的文档,但对我来说非常不清楚!再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多