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 に答える