2

我有这个XML来自命令行输出的示例模板,

<config xmlns="http://tail-f.com/ns/config/1.0">
  <random xmlns="http://random.com/ns/random/config">
    <junk-id>1</junk-id>
    <junk-ip-address>1.2.2.3</junk-ip-address>
    <junk-state>success</junk-state>
    <junk-rcvd>158558</junk-rcvd>
    <junk-sent>158520</junk-sent>
    <foobar>
      <id1>1</id1>
      <id2>1</id2>
    </foobar>
  </random>
</config>

junk-state我需要从中提取 的值XML

我制作了一个.tcl脚本来运行这个变量并使用单引号用于测试目的,如下所示,

以下是我的脚本的内容。我只是尝试在节点周围循环,但没有成功。

set XML "<config xmlns='http://tail-f.com/ns/config/1.0'>
      <random xmlns='http://random.com/ns/random/config'>
        <junk-id>1</junk-id>
        <junk-ip-address>1.2.2.3</junk-ip-address>
        <junk-state>success</junk-state>
        <junk-rcvd>158558</junk-rcvd>
        <junk-sent>158520</junk-sent>
        <foobar>
          <id1>1</id1>
          <id2>1</id2>
        </foobar>
      </random>
    </config>"


set doc [dom parse $XML]
set root [$doc documentElement]
set mynode [$root selectNodes "/config/random" ]

 foreach node $mynode{
    set temp1 [$node text]
    echo "temp1 - $temp1"
 }

上面的脚本不产生任何输出,

还尝试了xpath如下直接表达式并打印文本

set node [$root selectNodes /config/random/junk-state/text()]
puts [$node nodeValue]
puts [$node data

这会产生错误

invalid command name ""
    while executing
"$node nodeValue"
    invoked from within
"puts [$node nodeValue]"
    (file "temp.tcl" line 41)

我在这里做错了什么。想知道如何使用/修改我的xpath表达方式,因为我觉得这样更整洁。

$ tclsh
% puts $tcl_version
8.5
% package require tdom
0.8.3
4

1 回答 1

4

问题是由于 XML 命名空间(和元素xmlns中的属性)造成的。您必须使用操作选项:configrandom-namespaceselectNodes

package require tdom
set XML {<config xmlns="http://tail-f.com/ns/config/1.0">
      <random xmlns="http://random.com/ns/random/config">
        <junk-id>1</junk-id>
        <junk-ip-address>1.2.2.3</junk-ip-address>
        <junk-state>success</junk-state>
        <junk-rcvd>158558</junk-rcvd>
        <junk-sent>158520</junk-sent>
        <foobar>
          <id1>1</id1>
          <id2>1</id2>
        </foobar>
      </random>
    </config>}


set doc [dom parse $XML]
set root [$doc documentElement]
set node [$root selectNodes -namespace {x http://random.com/ns/random/config} x:random/x:junk-state ]
puts [$node text]

编辑:如果您希望<random>从 XML 中自动检索元素的命名空间,您可以按如下方式进行操作(假设它<random>是根元素的唯一子元素):

set doc [dom parse $XML]
set root [$doc documentElement]
set random [$root childNode]
set ns [$random namespace]
set node [$random selectNodes -namespace [list x $ns] x:junk-state]
puts [$node text]
于 2017-03-03T12:34:04.817 回答