TCL TDom: цикл по объектам - PullRequest
       11

TCL TDom: цикл по объектам

2 голосов
/ 09 апреля 2010

Используя 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 { 

Для каждого объекта мне нужно получить связь каждого атрибута. Из примера мне нужно помнить, что «name» - это «System Name», «vendor» - «Dell» и т. Д.

Я новичок в TCL, но на других языках я бы использовал объект или ассоциативный список для их хранения. Это возможно? Можете ли вы показать мне пример синтаксиса для выбора атрибута таким образом?

Ответы [ 2 ]

1 голос
/ 10 апреля 2010

Вы действительно на правильном пути. Вы, вероятно, хотите сделать это:

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 голосов
/ 05 июля 2017
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

...