数据.xml
<people>
<person name="John">
<param name="age" value="21" />
</person>
<person name="Jane">
<param name="age" value="25" />
</person>
</people>
我有这段 XML。我正在编写一个脚本以将节点附加<person>
到<people>
节点。我正在使用 XML::Simple
(请不要建议我使用另一个库,我知道它的困难)。
my $remove_person = "Jane";
my $xml = XMLin('data.xml', ForceArray => 1, KeepRoot => 1, KeyAttr => []);
if(exists $xml->{people}[0]{person}){
my $var = $xml->{people}[0]{person};
my $count = @$var;
my $person_index = 0;
for(my $i = 0; $i < $count; $i++){
if($xml->{people}[0]{person}[$i]->{name} eq $remove_person){
print "Person found at " . $person_index . " index";
$person_index = $i;
$person_to_remove = $xml->{people}[0]{person}[$i];
}
}
} else {
print "Person not found in data.xml\r";
}
上面的代码将为我提供我希望删除的节点的索引。从这一点开始,我遇到了麻烦。我无法找到从数据中删除此索引的正确方法。
到目前为止,我已经尝试了一种 using 的方法splice
,它返回了我想要删除的 XML 部分,然后我用来XMLout()
将数组转换回 XML。使用=~ s///g
,我能够编辑节点更改(<person>
成为<opt>
)。一旦我XMLout()'ed
有了原始的 data.xml 结构,我就尝试用原始结构的空字符串替换 XML 的可移动部分的变量。
显然,这没有奏效。
my $new_xml = XMLout($xml, KeepRoot => 1);
my $remove_xml = XMLout($person_to_remove, KeepRoot => 1);
$remove_xml =~ s/opt/person/g;
$new_xml =~ s/($remove_xml)//g; # facepalm, i know
我将如何通过删除数组数据或删除纯文件文本来删除这部分 XML,以便将新结构写回原始 data.xml 文件?