2

使用 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 的新手,但在其他语言中,我会使用对象或关联列表来存储这些。这可能吗?你能告诉我以这种方式选择属性的语法示例吗?

4

2 回答 2

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 是多么容易,我实际上很想保留文档本身并直接对其进行处理;无需仅仅为了它而将所有内容提取到其他数据结构中。

于 2010-04-10T13:42:48.963 回答
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

于 2017-07-05T06:50:29.943 回答