1

我正在尝试使用 tclsh 脚本中的 TDOM 解析器删除现有的 xml 节点。尝试删除不存在的节点时,tcl 代码会引发错误。

在 tdom 中访问节点之前,有什么方法可以检查节点是否存在。

这是我在尝试删除 delNode 时得到的:

invalid command name ""
    while executing
"[$root selectNodes $xpath/delNode] delete"
4

1 回答 1

4

我不确定在“在 tdom 中访问它”之前提前检查节点是否存在是否可行,但这至少部分是因为我永远不会那样做。最合理的方法似乎是首先 1) 查找节点,然后 2) 检查是否找到任何节点。

$root selectNodes $xpath/delNode

返回与您提供的 xpath 表达式匹配的零个或多个节点的列表1。在这种情况下,似乎没有找到节点。您可以使用以下内容进行测试:

set nodes [$root selectNodes $xpath/delNode]
if {[llength $nodes]} {
    # ...
}

# ...只有当您至少有一个节点时,才会执行省略的部分。另一个习惯用法是遍历节点:

foreach node $nodes {
    # ...
}

这将为每个节点执行一次省略的部分,但如果列表为空,则根本不会执行。

如果您确信只有第一个节点会让您感兴趣,您可以使用

set node [lindex $nodes 0]

(如果nodes没有任何元素,node现在将有一个空字符串的值,所以你仍然需要在使用它之前检查它。)

底线是,selectNodes为您提供了一个节点列表(无论表达式是否匹配零次、一次或n次。您可以使用 测试该列表llength,或者使用 查看列表中的每个节点foreach,或者执行任何其他类型的列表如果您在变量中获得节点列表中的元素之一node,它将是空字符串或管理该节点的命令的名称。

您检查变量的内容与空字符串

if {$node ne {}} {
    # ...
}

在这种情况下,当且仅当 的内容与空字符串node“不相等”( ) 时,才会执行省略的部分。ne

一旦确定它node包含命令名称,就可以使用.$node argument(s)

文档:foreachiflindexllengthset

tDOM 记录在这里:http ://tdom.github.io/index.html


1表达式结果为字符串时除外。

于 2014-02-28T13:37:43.880 回答