<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来定位相应的参数。请告诉我该怎么做,谢谢!
答案 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 dict
个对象。有关dict
的更多信息,请查看您的Tcl手册。