使用perl中的XML :: Smart获取父标记及其位置

时间:2013-11-20 09:16:27

标签: xml perl xml-parsing libxml2

我有类似这样的XML。

my $XML='<?xml version="1.0" encoding="ISO-8859-1"?>
<TEST>
  <PERSON name="Melissa">
    <PET type="carnivorous">Cat</PET>
    <PET>Dog</PET>
    <AGE>24</AGE>
    <CAR>Y</CAR>
  </PERSON>
  <PERSON name="Thomas">
    <PET type="herbivorous">cow</PET>
    <AGE>28</AGE>
    <CAR>N</CAR>
  </PERSON>
</TEST>
';

这就是我想要的结果。

my $XML='<?xml version="1.0" encoding="ISO-8859-1"?>
<TEST>
  <PERSON name="Melissa">
    <PET type="carnivorous">Cat</PET>
    <PET>Dog</PET>
    <AGE>24</AGE>
    <CAR>Y</CAR>
  </PERSON>
  <PERSON name="Thomas">
    <PET type="herbivorous">cow</PET>
    <PET type="herbivorous">goat</PET>
    <AGE>28</AGE>
    <CAR>N</CAR>
  </PERSON>
</TEST>
';

我想要遵循的步骤是:

1.搜索“食草”类型的标签

my $test_data = XML::Smart->new($XML);
my $Parent_pos=$test_data->{TEST}{PERSON}{PET}('type','eq','herbivorous');
my $new_tag= { type =>"herbivorous" };

2.如何插入新标签“山羊”?我想到了“牛”的父母,插入一个新的标签,但我无法找到方法。

请帮忙!

1 个答案:

答案 0 :(得分:0)

您无法同时在多个元素内搜索。如果你写

$test_data->{TEST}{PERSON}{PET}('type', 'eq', 'herbivorous')

您正在查看PERSON中的第一个 TEST元素,该元素没有食草宠物,因此您返回一个空集。相反,您必须遍历所有PERSON元素以找到具有食草宠物的元素。

这段代码会查看每个PERSON,并在他们已经拥有食草宠物的情况下在他们的宠物列表末尾添加食草大象。

my $test_data = XML::Smart->new($XML);
my $people = $test_data->{TEST}{PERSON};

for my $person (@$people) {
  my $pets = $person->{PET};
  if ($pets->(qw/ type eq herbivorous /)) {
    push @$pets, { type => 'herbivorous', CONTENT => 'elephant'};
  }
}

print scalar $test_data->data(nometagen => 1);

<强>输出

<?xml version="1.0" encoding="utf-8" ?>
<TEST>
  <PERSON name="Melissa">
    <PET type="carnivorous">Cat</PET>
    <PET>Dog</PET>
    <AGE>24</AGE>
    <CAR>Y</CAR>
  </PERSON>
  <PERSON name="Thomas">
    <PET type="herbivorous">cow</PET>
    <PET type="herbivorous">elephant</PET>
    <AGE>28</AGE>
    <CAR>N</CAR>
  </PERSON>
</TEST>