首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Perl XPath获取属性值

使用Perl XPath获取属性值
EN

Stack Overflow用户
提问于 2016-01-17 00:11:41
回答 1查看 1.2K关注 0票数 1

我试图从这个XML代码上的id中提取属性messaggioUtente

代码语言:javascript
运行
复制
<?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,但是我得到了一个不正确的结果:

代码语言:javascript
运行
复制
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为止。所以我的代码是这样的,但是由于字符串问题,它是不正确的。

代码语言:javascript
运行
复制
$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;
        } 
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-17 04:03:28

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

按顺序获取下一个ID的最佳方法是找到所有id属性的最大值并将其添加到其中

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

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

代码语言:javascript
运行
复制
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>

输出

代码语言:javascript
运行
复制
New ID = 4
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34833623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档