使用Perl XPath获取属性值

时间:2016-01-17 00:11:41

标签: xml perl xpath

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

<?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;
        } 
    }

1 个答案:

答案 0 :(得分:2)

节点集的每个元素都是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