我正在尝试使用XML :: Smart库从Perl脚本更新xml文件。
示例XML文件:
<food>
<fruit>
<name>banana</name>
<price>12</price>
</fruit>
<fruit>
<name>apple</name>
<price>13</price>
</fruit>
<fruit>
<name>orange</name>
<price>19</price>
</fruit>
</food>
我想将苹果价格从13更新为14。
我试过了:
#!/usr/bin/perl
use XML::Smart;
my $XML = XML::Smart->new(file.xml);
$XML->{food}{fruit}[$X]{price} = 14 ;
$XML->save($file);
如果我知道名为apple的fruit元素的索引号$ X,这可能会有效。 在这里我们可以看到它是1,因为索引从0开始,但是在多个水果元素的情况下,我怎么能得到只知道水果名称的索引?
答案 0 :(得分:3)
您必须使用name
apple
use strict;
use warnings 'all';
use XML::Smart;
my $xml = XML::Smart->new(\*DATA);
my $fruits = $xml->{food}{fruit};
my @apples = grep { $_->{name} eq 'apple' } @$fruits;
die scalar @apples . " apples found" unless @apples == 1;
$apples[0]{price} = 14;
print scalar $xml->data(nometagen => 1);
__DATA__
<food>
<fruit>
<name>banana</name>
<price>12</price>
</fruit>
<fruit>
<name>apple</name>
<price>13</price>
</fruit>
<fruit>
<name>orange</name>
<price>19</price>
</fruit>
</food>
fiels搜索数据结构中的水果
您可能还需要确保只有一个这样的元素
代码看起来像这样
<?xml version="1.0" encoding="UTF-8" ?>
<food>
<fruit>
<name>banana</name>
<price>12</price>
</fruit>
<fruit>
<name>apple</name>
<price>14</price>
</fruit>
<fruit>
<name>orange</name>
<price>19</price>
</fruit>
</food>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define MaxC 4
#define MaxL 5
int main(){
int n1=0, n2=0, n3=0, n4=0, n5=0, n6=0, n7=0, n8=0, n9=0, n0=0;
int i=0,j=0,r;
int n[MaxL][MaxC];
srand(time(NULL));
while(i<5){
j=0;
while(j<4){
r=(rand()%10);
if(r==0 && n0<2){
n0++;
j++;
n[i][j]=r;
printf(" %3d ",n[i][j]);
}
if(r==1 && n1<2){
n1++;
j++;
n[i][j]=r;
printf(" %3d ",n[i][j]);
}
if(r==2 && n2<2){
n2++;
j++;
n[i][j]=r;
printf(" %3d ",n[i][j]);
}
if(r==3 && n3<2){
n3++;
j++;
n[i][j]=r;
printf(" %3d ",n[i][j]);
}
if(r==4 && n4<2){
n4++;
j++;
n[i][j]=r;
printf(" %3d ",n[i][j]);
}
if(r==5 && n5<2){
n5++;
j++;
n[i][j]=r;
printf(" %3d ",n[i][j]);
}
if(r==6 && n6<2){
n6++;
j++;
n[i][j]=r;
printf(" %3d ",n[i][j]);
}
if(r==7 && n7<2){
n7++;
j++;
n[i][j]=r;
printf(" %3d ",n[i][j]);
}
if(r==8 && n8<2){
n8++;
j++;
n[i][j]=r;
printf(" %3d ",n[i][j]);
}
if(r==9 && n9<2){
n9++;
j++;
n[i][j]=r;
printf(" %3d ",n[i][j]);
}
}
i++;
}
return 0;
}