如何检查 tdom(tcl) 中是否存在 xml 节点?

Ash*_*win 1 xml tcl tdom

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

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

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

invalid command name ""
    while executing
"[$root selectNodes $xpath/delNode] delete"
Run Code Online (Sandbox Code Playgroud)

Pet*_*rin 5

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

$root selectNodes $xpath/delNode
Run Code Online (Sandbox Code Playgroud)

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

set nodes [$root selectNodes $xpath/delNode]
if {[llength $nodes]} {
    # ...
}
Run Code Online (Sandbox Code Playgroud)

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

foreach node $nodes {
    # ...
}
Run Code Online (Sandbox Code Playgroud)

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

如果您确信只有第一个节点会让您感兴趣,您可以使用以下命令获取它

set node [lindex $nodes 0]
Run Code Online (Sandbox Code Playgroud)

(如果nodes没有任何元素,node现在将具有空字符串的值,因此您仍然需要在使用它之前检查它。)

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

您可以使用以下命令检查变量的内容与空字符串

if {$node ne {}} {
    # ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

文档:foreachiflindexllengthset

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


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