在TCL脚本中
<server serverName='localhost'>
<port Number="6209" xmlLoc="path">
<pollerName>Nymex Feed Test1</pollerName>
<pollerName>Nymex Feed Test2</pollerName>
</port>
<port Number="6209" xmlLoc="path">
<pollerName>Nymex Feed Test1</pollerName>
<pollerName>Nymex Feed Test2</pollerName>
</port>
</server>
我想将上面的xml标记属性和节点值读入变量。
请告知。
更新:以下是阅读XML的最终解决方案。
package require tdom
set xmlpath "test.xml"
set fd [open $xmlpath]
set xml [read $fd]
set doc [dom parse $xml]
set root [$doc documentElement]
foreach node [$root selectNodes "/server/port"] {
set num [$node getAttribute Number]
set loc [$node getAttribute xmlLoc]
puts $num
puts $loc
foreach nodeList [$node selectNodes ./pollerName/text()] {
puts [$nodeList nodeValue]
}
}
后来:
我不能使用变量进入嵌套循环来调用Function,它无法在第二个循环中调用Function。请告知CODE ::
proc remoteTelnet {serNumber pNumber xmlRoot} {
set body1 [concat $body "<tr><td>$pNumber and $polName</td> <td>Password not changed</td></tr>"]
puts "Poller:-- $polName"
}
foreach node [$root selectNodes "/server/port"] {
set num [$node getAttribute Number]
set loc [$node getAttribute xmlLoc]
foreach nodeList [$node selectNodes ./pollerName/text()] {
set poller [$nodeList nodeValue]
puts "Poller: $poller"
puts "Port: $num"
puts "Xml Path: $loc"
remoteTelnet $host $num $loc
}
}
答案 0 :(得分:2)
使用XPath获取tDOM的所有内容pretty easy。
# Assuming you've already read the data as simple text into a variable
set doc [dom parse $XML]
现在让我们从属性中获取一个值:
set firstPortNumber [lindex [$dom selectNodes /server/port/@Number] 0 1]
大!现在让我们获取元素的文本内容:
set pollerName [[$doc selectNodes {/server/port[1]/pollerName[1]}] asText]
您可以使用XPath和基本DOM操作来执行批次。请注意,XPath的某些部分可能会干扰Tcl的语法;您可能需要引用搜索词(如上所述)。