Perl 移除节点



我从Perl开始,我知道有一些类似的问题得到了解答,但是(由于我缺乏经验)没有一个是有帮助的。

我有这样的 xml:

<workflowVertices>
<workflowVertex>
<alias />
<task>Task_L2</task>
<vertexId>128</vertexId>
</workflowVertex>
<workflowVertex>
<alias />
<task>preTask_L1</task>
<vertexId>129</vertexId>
</workflowVertex>
</workflowVertices>

我需要删除所有具有节点任务 =~ m/_L1/的工作流顶点节点

我现在拥有的:

my $dom = XML::LibXML->load_xml(location => $filename);
foreach my $name ($dom->findnodes('workflowVertices/workflowVertex/task')) 
{
#say $name->to_literal();
if ($name->to_literal() =~ m/_L1/) {
say "JobName: " . $name->to_literal() . " to be deletedn";
my $node = $name->to_literal();
my $parent = $name-> parentNode();
say $parent-> removeChild("task[$node]")
}
}

但是当我执行它时,它会出现错误:

XML::LibXML::Node::removeChild() -- node is not a blessed SV reference at 

xmltransform.pl 第 28 行。

第 28 行。 在我的代码中是

say $parent-> removeChild("task[$node]")

有人会帮我吗?

首先,请使用更好的变量名。你可怕的名字($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")]');

以下是removeChild()方法的文档:

删除子项

$childnode = $node->removeChild( $childnode );

这将解除子节点与其父节点$node的绑定。该函数返回 未绑定的节点。如果oldNode不是给定节点的子节点,则函数 将失败。

(那里有一个错别字 - 它说oldNode,我很确定这意味着$childNode

也许不是很清楚,但你需要传递removeChild()节点对象,而不仅仅是一个字符串。你给它传递文字字符串"task[preTask_L1]",我真的不确定你从哪里得到这个想法。

我认为您通过为变量使用错误的名称来混淆自己。$name变量包含节点对象,而不是名称。您的$node变量包含来自节点的文本(可能被视为其"名称")。

我认为最简单的解决方法是将您的代码行更改为:

say $parent->removeChild($name);

但我真的建议也修复这些变量名称。 您的维护程序员(很可能在六个月内成为您)会感谢您:-)

相关内容

  • 没有找到相关文章

最新更新