我正在尝试从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::XPath
和XML::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;
}
}
答案 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