如何使用父节点对象在JScript中使用XML查询选择具有特定属性值的特定子节点?

时间:2015-12-16 12:34:36

标签: xml xpath jscript

My XML:
     <tests>
     <test name="Machine1" enabled="true">
     <action enabled="true" Result="true">T_1</action>
     <action enabled="true" Result="false">T_2</action>
     <action enabled="true" Result="true">T_3</action>
     <action enabled="true" Result="none">T_4</action>
     </test>
     <test name="Machine2" enabled="false">
     <action enabled="true" Result="true">T_5</action>
     <action enabled="true" Result="false">T_6</action>
     <action enabled="true" Result="false">T_7</action>
     <action enabled="true" Result="true">T_8</action>
     </test>
     </tests>

我想从&#34; test&#34;中选择具有属性[@Result =&#39; true&#39;]的子节点。具有属性[@enabled =&#39; true&#39;]的节点。 即理想情况下它应该给出两个节点:

<action enabled="true" Result="true">T_1</action>
<action enabled="true" Result="true">T_3</action>

相反,我从整个xml中获取所有节点的属性[@Result =&#39; true&#39;]。即:

<action enabled="true" Result="true">T_1</action>
<action enabled="true" Result="true">T_3</action>
<action enabled="true" Result="true">T_5</action>
<action enabled="true" Result="true">T_8</action>

我的代码:

var filepath = "C:\\Test.xml"
var oXML = Runner.CallMethod("XMLLib.LoadDOM", filepath);
var testNodes = oXML.SelectNodes("//test");
for (var i=0; i<testNodes.length; i++)
    {
     var test = testNodes.nextNode;
     if (test.getAttribute("enabled") == "true")
        {
        var pass = test.SelectNodes("//action[@Result='true']").length;
        var fail = test.SelectNodes("//action[@Result='false']").length;
        var missing = test.SelectNodes("//action[@Result='none']").length;
        }
    }

请帮助我解决方案或任何其他方式来获得所需的结果......谢谢!

2 个答案:

答案 0 :(得分:0)

尝试执行以///开头的相对XPath时,这是一个常见错误。您需要在XPath的开头放置一个点(.),使其相对于当前上下文元素,这是变量test引用的元素:

var pass = test.SelectNodes(".//action[@Result='true']").length;

要获得直接子元素,您可以使用./child::action,或仅使用./action,甚至只使用action。更简单的表单是可能的,因为child::是XPath中的默认轴。当您没有明确提及任何其他轴时,将选择使用它:

var pass = test.SelectNodes("action[@Result='true']").length;

答案 1 :(得分:0)

相反,我尝试将查询修改为:

var name = test.getAttribute("name");
var testNode = "//test[@name=" + "'" + name + "'"; 
var pass = test.SelectNodes(testNode + "]/action[@Result='true']").length;

我正在获得所需的输出。 这是正确/有效的方式吗?