2014-02-21 4 views
1

В TCL ScriptРазбор XML-файлов в переменной

<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] 
} 

}

Позже:

я не могу использовать переменную в вложенном цикле для вызова функции, она не вызов функции во втором цикле. Пожалуйста посоветуйте 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

Google предоставляет [TclXML] (http://tclxml.sourceforge.net/tclxml.html) и [эту вики] (http://wiki.tcl.tk/11020). Вы пробовали кого-нибудь из них, прежде чем задавать свой вопрос здесь? – Jerry

+0

Я использовал пакет tdom TCL, я не знаю, что вы сказали? – Hmnshu

ответ

2

Пришло pretty easy, чтобы получить все, что материал с tDOM с XPath.

# 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; вам может потребоваться указать условия поиска (как указано выше).

+0

в случае, если мне нужно зациклиться, и тогда может быть больше тегов выше образца – Hmnshu

+0

@Hmnshu Метод 'selectNodes' возвращает список узлов, которые вы можете перебирать (кроме атрибутов, по-видимому, когда он возвращает список пар), поэтому 'foreach node [$ doc selectNodes ...] {dostuff}' является общим шаблоном. –

+0

Спасибо Man :) Donal – Hmnshu

Смежные вопросы