Прежде всего, пожалуйста, используйте лучшие имена переменных. Ваши ужасные имена ($name
- это узел task
, $node
вовсе не является узлом, непонятно, чей родитель относится к $parent
и т. Д.) Делает ваш код чрезвычайно трудным для чтения.
Вы можете использовать
$vertex_node->parent->removeChild($vertex_node);
или
$vertex_node->unbindNode;
для удаления узла. Исправлено:
my $dom = XML::LibXML->load_xml( location => $filename );
for my $task_node ($dom->findnodes('/workflowVertices/workflowVertex/task')) {
my $task_name = $task_node->textContent();
if ($task_name =~ /_L1/) {
my $vertex_node = $task_node->parent;
$vertex_node->unbindNode;
say "Deleted task $task_name.";
}
}
Альтернативный подход:
my $dom = XML::LibXML->load_xml( location => $filename );
for my $vertex_node ($dom->findnodes('/workflowVertices/workflowVertex')) {
my $task_name = $vertex_node->findvalue('task/text()');
if ($task_name =~ /_L1/) {
$vertex_node->unbindNode;
say "Deleted task $task_name.";
}
}
Если вам не нужно распечатывать имя задачи, это может быть сокращено до следующего:
my $dom = XML::LibXML->load_xml( location => $filename );
$_->unbindNode
for $dom->findnodes('/workflowVertices/workflowVertex[contains(task/text(), "_L1")]');