2010-04-09 112 views
2

使用TDOM循环,我想循环通过以下格式的对象的列表:TCL TDOM:通过对象

<object> 
     <type>Hardware</type> 
     <name>System Name</name> 
     <description>Basic Description of System.</description> 
     <attributes> 
      <vendor>Dell</vendor> 
      <contract>MM/DD/YY</contract> 
      <supportExpiration>MM/DD/YY</supportExpiration> 
      <location>Building 123</location> 
      <serial>xxx-xxx-xxxx</serial> 
      <mac>some-mac-address</mac> 
     </attributes> 
    </object> 

    <object> 
     <type>Software</type> 
     <name>Second Object</name> 
    ... 

然后我用TDOM使对象的列表:

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

set nodeList [$doc selectNodes /systems/object] 

到目前为止,我已经完成了(理论上)从列表中选择每个“对象”节点。我如何循环浏览它们?它只是:

foreach node $nodeList { 

对于每个对象,我需要检索每个属性的关联。从示例中,我需要记住“名称”是“系统名称”,“供应商”是“戴尔”等。

我是新来的TCL,但在其他语言中,我会使用一个对象或关联列表来存储这些。这可能吗?你能告诉我一个以这​​种方式选择属性的语法示例吗?

回答

1

你的确处于正确的轨道上。你可能想这样做:

foreach node [$doc selectNodes "/systems/object"] { 
    set name [[$node selectNodes "./name\[1\]"] text] 
    lappend listOfNames $name 
    foreach attr {vendor serial} { 
     set aNodes [$node selectNodes "./attributes/$attr"] 
     if {[llength $aNodes]} { 
      set data($name,$attr) [[lindex $aNodes 0] text] 
     } 
    } 
} 

我正在使用Tcl的(关联)数组功能来保存提取的属性。还有其他方法也可以工作,例如,iTcl或XOTcl或TclOO对象,或字典或任何其他可能性。请注意,考虑到实际使用tDOM是多么容易,我实际上很想保留文档本身并直接处理它,不需要将所有东西都提取到其他数据结构中,而仅仅是为了它。

+0

谢谢您的帮助,这是我需要什么。你是对的,我可能会最好直接从tDOM使用每个属性。我的下一个冒险是建立每个解析对象到数据库对象。乐趣:-) – pws5068 2010-04-10 16:22:20

+0

最重要的是要准确计划你想要达到的目标,哪些部分应该去哪里等等。我发现信封的背面是做这些计划的好地方。 :-) – 2010-04-10 19:53:46

0
set doc [$dom documentElement] 
set nodeList [$doc selectNodes /systems/object] 

foreach node [$nodeList childNodes] { 
    set nodename [$node nodeName] 
    if {$nodename eq "attributes"} { 
     foreach attr_node [$node childNodes] { 
      set attr_nodename [$attr_node nodeName] 
      set attr_nodetext [[$attr_node selectNodes text()] nodeValue] 
      puts "$attr_nodename : $attr_nodetext" 
     } 
    } else { 
     set node_text [[$node selectNodes text()] nodeValue] 
     puts "$nodename : $node_text" 
    } 
} 

检查了这一点为快速参考https://tdom.github.io/domDoc.html