将xml文件解析为变量

时间:2014-02-21 09:42:46

标签: tcl

在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

}
}

1 个答案:

答案 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的语法;您可能需要引用搜索词(如上所述)。

相关问题