【问题标题】:How to select specific child nodes, having particular attribute value, using the parent node object, using XML query in JScript?如何选择具有特定属性值的特定子节点,使用父节点对象,使用 JScript 中的 XML 查询?
【发布时间】:2015-12-16 12:34:36
【问题描述】:
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>

我想从具有属性 [@enabled='true'] 的“测试”节点中选择具有属性 [@Result='true'] 的子节点。 即理想情况下它应该给出两个节点:

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

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

<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;
        }
    }

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

【问题讨论】:

    标签: xml xpath jscript


    【解决方案1】:

    这是尝试执行以/// 开头的相对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;
    

    【讨论】:

    • 我尝试使用 var pass = test.SelectNodes("./child::action[@Result='true']").length;和 var pass = test.SelectNodes(".//action[@Result='true']").length;得到'pass = 0'
    • 看来“。”不管用。还是我在语法中遗漏了什么?
    • @Astral action 的属性名称实际上是什么,ATPResult 或只是 Result
    • @Astral 我不熟悉 JScript,但我怀疑问题出在这一行:var test = testNodes.nextNode;。我的回答假设test 正确引用了当前&lt;test&gt; 元素。尝试使用foreach 循环,例如foreach (test in testNodes){ ... }
    【解决方案2】:

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

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

    我得到了想要的输出。 这是正确/有效的方式吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-31
      • 1970-01-01
      相关资源
      最近更新 更多