MsXMl selectNodes返回多余的节点

时间:2013-02-05 10:19:03

标签: xml excel vba msxml selectnodes

我正在编写这个VBA脚本,以自动化自动化结果的制表。我尝试解析的节点示例如下:

> <test id="41">
>           <name>7.1.1.4_BandI_PS</name>
>           <ttcnTestCaseName>7.1.1.4</ttcnTestCaseName>
>           <numberOfIterations>1</numberOfIterations>
>           <failureAction selected="Continue"/>
>           <runMode>Normal</runMode>
>           <testPicsPixitDeviation>
>             <picsPixitDeviationTag>BandI</picsPixitDeviationTag>
>             <picsPixitDeviationTag>PS</picsPixitDeviationTag>
>             <picsPixitDeviationTag>NonCipher</picsPixitDeviationTag>
>         </testPicsPixitDeviation>
>           <comment/>
>           <result iterationIndex="0" repeatIndex="0">
>             <status>
>               <status>Passed</status>
>             </status>
>             <resultLocation>C:\result_arch\MAC_D12wk47_v10-tc_7_1_1_4_2013-01-07_15.18.27</resultLocation>
>             <startTime>2013-01-07_15.18.26</startTime>
>             <executionDuration>120</executionDuration>
>             <ptsIpAddress>127.0.0.1</ptsIpAddress>
>           </result>
>         </test>
>         <test id="42">
>           <name>7.1.1.8_BandI_CS</name>
>           <ttcnTestCaseName>7.1.1.8</ttcnTestCaseName>
>           <numberOfIterations>1</numberOfIterations>
>           <failureAction selected="Continue"/>
>           <runMode>Normal</runMode>
>           <testPicsPixitDeviation>
>             <picsPixitDeviationTag>BandI</picsPixitDeviationTag>
>             <picsPixitDeviationTag>CS</picsPixitDeviationTag>
>             <picsPixitDeviationTag>NonCipher</picsPixitDeviationTag>
>         </testPicsPixitDeviation>
>           <comment/>
>           <result iterationIndex="0" repeatIndex="0">
>             <status>
>               <status>Passed</status>
>             </status>
>             <resultLocation>C:\result_arch\MAC_D12wk47_v10-tc_7_1_1_8_2013-01-07_15.20.27</resultLocation>
>             <startTime>2013-01-07_15.20.27</startTime>
>             <executionDuration>104</executionDuration>
>             <ptsIpAddress>127.0.0.1</ptsIpAddress>
>           </result>
>         </test>

从上面可以看出,测试节点可以拥有尽可能多的结果,具体取决于迭代次数。我使用selectNodes方法来解析文件中的所有节点,这可以恢复正确数量的元素。 对于我返回的列表中的每个测试用例,我解析了每个节点的嵌套列表中有多少并返回列表。 问题是不是返回嵌套在每个中,列表返回文本文件中不应该的所有内容。 我的代码如下。

Dim testCase As MSXML2.IXMLDOMNode
For Each testCase In testCaseNamesList
    Dim passed, failed, error, totalRunTime, iterationCount As Integer
    Dim passPcnt, failPcnt, errorPcnt, averageRunTime As Double
    Dim testCaseName As String
    Dim testCaseResultList As MSXML2.IXMLDOMNodeList


    Set testCaseResultList = testCase.SelectNodes("//result")
    MsgBox (testCaseResultList.Length)

    testCaseName = testCase.FirstChild.Text
    iterationCount = CInt(testCase.SelectSingleNode("//numberOfIterations").Text)

    Dim testCaseResult As MSXML2.IXMLDOMNode
    For Each testCaseResult In testCaseResultList

一切正常但变量testCaseResultList应该返回每个节点中包含的列表,而是从其他节点返回。我不知道我做错了什么。

1 个答案:

答案 0 :(得分:2)

尝试.//result,因为它将返回上下文节点的所有“结果”后代(testCase指向的节点)或仅result将返回所有“结果”子节点上下文节点(但不会返回孙子,曾孙等)。

使用//result返回文档根目录的所有“结果”后代,它将返回文档中的每个“结果”节点

同样//numberOfIterations(返回文档根目录的所有“numberOfIterations”后代)应替换为.//numberOfIterations或仅numberOfIterations

有关详情,请参阅http://www.w3.org/TR/xpath/#path-abbrev的缩写语法指南