tcl dom将属性作为列表

时间:2014-05-30 11:19:33

标签: xml xpath tcl tdom

<Testcases>
<Testcase tc_name="tc1">
  <Parameters>
    <Input_Arguments>tc1_arg1</Input_Arguments>                 
    <Input_Arguments>tc2_arg2</Input_Arguments>
  </Parameters>  
</Testcase>
<Testcase tc_name="tc2">
  <Parameters>
    <Input_Arguments>tc2_arg1</Input_Arguments>
    <Input_Arguments>tc2_arg2</Input_Arguments>
  </Parameters>  
</Testcase>
</Testcases>

上面是我的xml,我想使用tdom首先读入所有“tc_name”属性作为tcl列表。然后使用列表中的每个tc_name来定位相应的参数。请告诉我该怎么做,谢谢!

2 个答案:

答案 0 :(得分:3)

你的标题是tcl dom,但你的问题是tdom,它被标记为tdom所以我会做出多数决定并给出一个tdom答案 - 它们是不同的包裹!

首先,您需要使用

解析原始xml
# Assumes that xmlText holds your raw XML
dom parse $xmlText doc

现在获取tc_name节点列表

set nodes [$doc selectNodes {Testcases/Testcase[@tc_name]}

现在围绕访问参数节点的节点循环

foreach node $nodes {
    set params [$node selectNodes Parameters]
    foreach param $params {
        # Do some stuff
    }
}

在您完成文档后,不要忘记删除该文档。 (请注意,如果您在proc中执行此操作,则会在proc退出时自动执行此操作。)

$doc delete

我不完全确定你最终想要做什么,所以这里有一些输出每个参数的代码,其tc_name,每行一个:

dom parse {<Testcases>
             <Testcase tc_name="tc1">
               <Parameters>
                 <Input_Arguments>tc1_arg1</Input_Arguments>                 
                 <Input_Arguments>tc2_arg2</Input_Arguments>
               </Parameters>  
             </Testcase>
             <Testcase tc_name="tc2">
               <Parameters>
                 <Input_Arguments>tc2_arg1</Input_Arguments>
                 <Input_Arguments>tc2_arg2</Input_Arguments>
               </Parameters>  
             </Testcase>
           </Testcases>
        } doc
foreach testcase [$doc selectNodes Testcases/Testcase] {
    set name [$testcase getAttribute tc_name]
    foreach arg [$testcase selectNodes Parameters/Input_Arguments] {
        foreach child [$arg childNodes] {
            puts stdout $name\ [$child nodeValue]
        }
    }
}
$doc delete;          # Tidy away the parsed document

我希望这能为您提供足够的指示,以便您能够完成任务

答案 1 :(得分:0)

这是使用XPath的替代解决方案。

package require tdom

proc getTestCases {xmlText} {
    # Get a list of <Testcase> nodes that have attribute tc_name
    set doc [dom parse $xmlText]
    set tcNodes [$doc selectNodes /Testcases/Testcase\[@tc_name\]]

    # For each <Testcase> node, get the tc_name attribute, then get the
    # arguments.
    set cases [dict create]
    foreach tcNode $tcNodes {
        set tcName [$tcNode @tc_name]
        set arguments {}
        foreach argNode [$tcNode selectNodes Parameters/Input_Arguments] {
            lappend arguments [$argNode text]
        }
        dict append cases $tcName $arguments
    }

    $doc delete
    return $cases
}

# Main

# Retrieve the XML text from a file
set f [open testcases.xml]
set xmlText [read $f]
close $f

# Retrieve the test cases and display them
set testCases [getTestCases $xmlText]
dict for {tcName argList} $testCases {
    puts "$tcName: $argList"
}

讨论

  • 函数getTestCases首先将XML解析为DOM文档
  • 然后调用selectNodes和XPath表达式来检索\ nodes
  • 列表
  • 对于每个节点,它会检​​索 tc_name 属性以及参数
  • 返回值是dict个对象。有关dict的更多信息,请查看您的Tcl手册。