Perl XML :: Smart:如何更新xml文件中的节点值?

时间:2016-07-25 15:21:07

标签: xml perl

我正在尝试使用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开始,但是在多个水果元素的情况下,我怎么能得到只知道水果名称的索引?

1 个答案:

答案 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;
}