1
<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 来定位对应的参数。请告诉我该怎么做,谢谢!

4

2 回答 2

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

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

于 2014-05-30T11:55:03.580 回答
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 文档
  • 然后它调用selectNodesXPath 表达式来检索 \ 节点列表
  • 对于每个节点,它检索tc_name属性以及参数
  • 返回值是一个dict对象。有关 的更多信息dict,请查阅您的 Tcl 手册。
于 2014-05-31T00:15:40.247 回答