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

在perl中使用XML::Smart获取父标记及其位置,xml,perl,xml-parsing,libxml2,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</C

我有一个类似这样的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>
';
2.如何插入新标签“goat”??我想得到“奶牛”的父母,并插入一个新的标签,但我无法想出一个办法


请帮忙

不能同时在多个元素中搜索。如果你写信

$test_data->{TEST}{PERSON}{PET}('type', 'eq', 'herbivorous')
您正在查找
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>

猫
狗
24
Y
奶牛
大象
28
N

就这样!:)谢谢!:)@用户2179627:不客气。请注意,我稍微更改了
print
语句。在列表上下文中,
$xml->data
返回一个scond参数,该参数是指示数据是否为Unicode文本的标志。因此,您需要添加
scalar
,以避免在XML后面打印虚假的
1
。另外,您可能不希望默认情况下创建
XML::Smart的内容,因此您还需要添加
nometagen=>1
选项。
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>