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

时间:2014-02-28 13:12:15

标签: xml tcl tdom

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

在tdom访问节点之前,有没有办法检查节点是否存在。

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

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

1 个答案:

答案 0 :(得分:4)

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

$root selectNodes $xpath/delNode

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

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

只有至少有一个节点才会执行以# ...省略的部分。另一个习惯用法是迭代节点:

foreach node $nodes {
    # ...
}

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

如果你确信只有第一个节点会让你感兴趣,你可以通过

获得它
set node [lindex $nodes 0]

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

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

使用

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

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

一旦您确定ne包含命令名称,就可以使用node调用它。

文档:foreachiflindexllengthset

tDOM在此处记录:http://tdom.github.io/index.html

<小时/> 1 除了表达式导致字符串。