我正在尝试使用tclsh脚本中的TDOM解析器删除现有的xml节点。在尝试删除不存在的节点时,tcl代码会抛出错误。
在tdom访问节点之前,有没有办法检查节点是否存在。
这是我在尝试删除delNode时得到的结果:
invalid command name ""
while executing
"[$root selectNodes $xpath/delNode] delete"
答案 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
调用它。
文档:foreach,if,lindex,llength,set
tDOM在此处记录:http://tdom.github.io/index.html
<小时/> 1 除了表达式导致字符串。