1

誰かが私を正しい方向に向けることができることを願っています。

私はTCLに比較的慣れていませんが、サンプルコードは、私が使用している他の言語(Javascript / VbScript / C#)と比較して非常に不足しています。

コード:


package require http

package require tdom

set html "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><s:Body><u:InfoResponse xmlns:u=\"urn:schemas-upnp-org:service:Transport:1\"><MyData>This is my final bit of data</MyData></u:InfoResponse></s:Body></s:Envelope>"


set doc [dom parse $html]

set root [$doc documentElement]

set node [$root selectNodes "/s:Envelope/s:Body/u:InfoResponse/MyData/text()"] 

puts [$node data]

エラーは次のとおりです。

プレフィックスが解決しない
    実行中
"$ root selectNodes" / s:Envelope / s:Body / u:InfoResponse / MyData / text() "
    内部から呼び出されます
"set node [$ root selectNodes" / s:Envelope / s:Body / u:InfoResponse / MyData / text()] "

XMLを変更し、要素の名前をEnvelope、Bodyなどに変更すると、正常に機能します(ただし、これはデータフィードであるため、可能な解決策ではありません)。XML解析スキルが少し不足していることを告白する必要があります。

私はオンラインのxQueryツールを試しましたが、それは問題なく解析されました。名前空間とTCLに関係があるのではないかと思いますが、どうしたらよいかわかりません。

基本的に、このビットのデータからプルバックする必要が<MyData>あるだけで、応答は1つだけなので、xQueryの代わりにもっと簡単な方法があるかもしれません。プルバックする必要がある他のデータのいくつかには複数のデータがあるので、それを行う方法を知っておくと便利です。

4

1 に答える 1

1

予想に反して、tDOMのselectNodesメソッドはコンテキストノードからの名前空間プレフィックスマッピングを使用しません。文書化されているように、そのマッピング-namespacesオプションを自分で提供する必要があります。

これを試して:

set nsmap {
    s  http://schemas.xmlsoap.org/soap/envelope/
    u  urn:schemas-upnp-org:service:Transport:1
}
set node [$root selectNodes -namespaces $nsmap \
        "/s:Envelope/s:Body/u:InfoResponse/MyData/text()"] 

接頭辞のない要素のマッピングについて少し心配しますが、マッピングから除外すると機能する可能性があります。(通常、同じドキュメント内で名前空間のある名前空間のないXMLを混合することはお勧めできません。)

于 2012-05-01T14:58:52.007 に答える