使用TDOM解析xml数据的问题

时间:2012-05-01 14:31:18

标签: xml-parsing tcl tdom

希望有人能指出我正确的方向。

我对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?我需要撤回的其他一些数据将有多个,所以知道如何做到这一点会很棒!

1 个答案:

答案 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命名空间通常不是一个好主意。)