2010-04-14 69 views
0

我正在使用tDom来遍历一些XML并提取每个元素的文本()。TCL tDom空XML标记

set xml { 
<systems> 
<object> 
    <type>Hardware</type> 
    <name>Server Name</name> 
    <attributes> 
    <vendor></vendor> 
    </attributes> 
</object> 
<object> 
    <type>Hardware</type> 
    <name>Server Two Name</name> 
    <attributes> 
    <vendor></vendor> 
    </attributes> 
</object> 
</systems> 
}; 

    set doc [dom parse $xml] 
    set root [$doc documentElement] 

    set nodeList [$root selectNodes /systems/object] 

    foreach node $nodeList { 

    set nType [$node selectNodes type/text()] 
    set nName [$node selectNodes name/text()] 
    set nVendor [$node selectNodes attributes/vendor/text()] 

    # Etc... 
    puts "Type: " 
    puts [$nType data] 

    # Etc .. 

    puts [$nVendor data] 
    } 

但是,当它试图打印出供应商,这是空的,它会导致错误无效命令名称“”。我怎么能忽略这一点,只需将$ nVendor设置为空字符串?

回答

4

节点的selectNodes方法返回匹配您的模式的节点列表。当您直接使用结果作为命令

set nName [$node selectNodes name/text()] 
puts [$nType data] 

你真的做的是一个事实,即1项(的name项目数)的列表是一样的一个项目的优势是什么。如果没有匹配的节点,你拿回一个空列表

set nVendor [$node selectNodes attributes/vendor/text()] ;# -> {} 

,当你调用,那是因为你调用一个名为{}命令抛出一个错误。

set nVendor [$node selectNodes attributes/vendor/text()] ;# -> {} 
puts [$nVendor data] ;# -> winds up calling 
{} data 

正如武海指出,你可以测试有通过检查对""结果的结果。 A“更正确”的方式很可能是检查它是否为空列表

set nVendor [$node selectNodes attributes/vendor/text()] 
if {[llength $nVendor] == 1} { 
    puts [$nVendor data] 
} 

,或者是更完整的(如果你不知道的输入XML)

set nVendor [$node selectNodes attributes/vendor/text()] 
switch -exact -- [llength $nVendor] { 
    0 { 
     # no nVendor, do nothing 
    } 
    1 { 
     # 1 vendor, print it 
     puts [$nVendor data] 
    } 
    default { 
     # weird, we got more than one vendor node... throw an error 
     error "More than one vendor node" 
    } 
} 
+0

如果你写XPath的方式稍有不同,你可以保证结果列表中只有0或1的值,并使用'llength'来测试,这是一个简单的操作。 – 2010-04-15 14:15:54

2

您可以检查,看看是否$ nVendor是一个空节点:

if {$nVendor != ""} { 
    puts [$nVendor data] 
} 
+0

更好地使用'ne' – 2010-04-15 14:16:21

+0

Donal:谢谢你的指导,我现在知道ne,eq ...应该用于字符串比较,!=,==用于数字。 – 2010-04-15 15:59:56