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()"
    从内部调用
"设置节点 [$root selectNodes "/s:Envelope/s:Body/u:InfoResponse/MyData/text()]"

如果我更改 XML 并将元素重命名为 Envelope、Body 等,它工作正常(但不是可能的解决方案,因为这是一个数据馈送)。我不得不承认我的 XML 解析技巧有点欠缺。

我尝试了一个在线 xQuery 工具,它可以解析它。我猜它可能与命名空间和 TCL 有关,但不知道该怎么做..

我基本上只需要<MyData>从这部分数据中提取出来,并且只会有一个响应,所以可能有一种更简单的方法而不是 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 回答