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

如何检查tdom(tcl)中是否存在xml节点?,xml,tcl,tdom,Xml,Tcl,Tdom,我正在尝试使用tclsh脚本中的TDOM解析器删除现有的xml节点。尝试删除不存在的节点时,tcl代码抛出错误 在tdom中访问节点之前,是否有任何方法检查节点是否存在 这是我在尝试删除delNode时得到的结果: invalid command name "" while executing "[$root selectNodes $xpath/delNode] delete" 我不确定在“在tdom中访问节点”之前提前检查节点是否存在是否可行,但这至少部分是因为我永远不会这样做。最

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

在tdom中访问节点之前,是否有任何方法检查节点是否存在

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

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

我不确定在“在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]
(如果
节点
没有任何元素,
节点
现在将具有空字符串的值,因此在使用它之前仍然需要检查它。)

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

使用以下命令对照空字符串检查变量的内容:

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

一旦确定
节点
包含命令名,就可以使用
$node参数
调用它

文件:

此处记录了tDOM:



1表达式产生字符串时除外。

我不确定在“在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]
(如果
节点
没有任何元素,
节点
现在将具有空字符串的值,因此在使用它之前仍然需要检查它。)

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

使用以下命令对照空字符串检查变量的内容:

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

一旦确定
节点
包含命令名,就可以使用
$node参数
调用它

文件:

此处记录了tDOM:


1表达式产生字符串时除外