希望有人能指出我正确的方向。
我对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]
错误是:
Prefix doesn't resolve while executing "$root selectNodes "/s:Envelope/s:Body/u:InfoResponse/MyData/text()" invoked from within "set node [$root selectNodes "/s:Envelope/s:Body/u:InfoResponse/MyData/text()]"
如果我改变XML并将元素重命名为Envelope,Body等,它可以正常工作(但这不是一个可能的解决方案,因为这是一个数据源)。我必须承认我的XML解析技巧有点缺乏。
我尝试了一个在线xQuery工具并且解析好了。我猜它可能与命名空间和TCL有关,但不知道该怎么办..
我基本上只需要从这一部分数据中撤回<MyData>
并且只有一个响应,所以可能有一种更简单的方法而不是xQuery?我需要撤回的其他一些数据将有多个,所以知道如何做到这一点会很棒!
答案 0 :(得分:1)
与您可能期望的相反,tDOM的selectNodes
方法不使用来自上下文节点的名称空间前缀映射;您必须使用the -namespaces
option, as documented自己提供该映射。
试试这个:
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命名空间通常不是一个好主意。)