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;
}
}
请帮助我解决方案或任何其他方式来获得所需的结果......谢谢!
答案 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;
我正在获得所需的输出。 这是正确/有效的方式吗?