data.xmlPerl, удаление 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";
}
выше фрагмент кода даст мне индекс узла я требуется удалить. С этого момента у меня возникли проблемы. Я не могу определить правильный способ удаления этого индекса из данных.
До сих пор я пробовал метод использования 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 новую структуру?
Функция удаления не рекомендуется использовать (иронично в моем случае, поскольку она написана в камне, я использую :: Simple). Конечным продуктом моего вопроса является скрипт системы телефонии, который без системы не может работать. Если бы была проведена правильная проверка индекса, могу ли я предположить, что использование delete не приведет к каким-либо «неожиданным поведением», как предупреждалось в документации perl? (У меня уже достаточно проблем с :: Simple, поэтому я бы предпочел уменьшить любую дополнительную сложность/риск) –
@Simon. 'delete' не следует использовать для массивов. Я использовал его для хэша, который в порядке. – choroba