在perl中使用XML::Smart获取父标记及其位置
我有一个类似这样的XML在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
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>