【问题标题】:XPATH select only first level childrenXPATH 仅选择第一级子级
【发布时间】:2016-03-16 02:28:32
【问题描述】:

我有fowoling xml:

  <workflow URI=""> 
  <output ID="" URI="#out1"/>  
  <input ID="sessionToken" URI="#sessionToken"/>  
  <services> 
    <sequence> 
      <service URI=""> 
        <input ID="" URI=""/>  
        <input URI="" value=""/>  
        <output ID="" URI=""/> 
      </service> 
    </sequence> 
  </services> 
</workflow>

我只想选择工作流节点的第一级子节点,并从该选择中排除服务节点,所以在我的情况下我只想要

 <output ID="" URI="#out1"/>  
 <input ID="sessionToken" URI="#sessionToken"/>  

选择了这两个节点,我想为此在 java 中使用 XPATH。附加要求是所选节点必须具有 URI 参数。

我已经试过了:

XPathExpression expr = xpath.compile("//workflow[@URI='" + oldUrlValue.getNodeValue() + "'] | //workflow//*[not(local-name() = 'services') and @URI]");

但我使用 URI 参数返回所有节点,而不是仅主工作流节点和前两个子节点。

我试过了

【问题讨论】:

    标签: java xml xpath


    【解决方案1】:

    不清楚您在这里所说的“一级子级”是什么意思,因为services 与output 和input 元素位于同一级别。如果您的意思是返回 workflow 的直接子元素 没有任何其他子元素,那么您可以使用以下 XPath 表达式:

    //workflow/*[not(*)]
    

    【讨论】:

    • 这就是我想要的,是的。 Tnx
    【解决方案2】:

    只需使用 astrik 选择器 (*) 选择 workflow 节点的子节点,然后只选择包含 URI 属性的子节点 ([@URI])

    //workflow[@URI='" + oldUrlValue.getNodeValue() + "']/*[@URI]
    

    【讨论】:

      【解决方案3】:

      要求:

      任何级别的工作流下方的第一级,以及参数 URI

      String expression = "//workflow/*[@URI]";
      

      或在顶部的工作流下方的第一级,以及参数 URI

      String expression = "/workflow/*[@URI]";
      

      或在顶部的任何标记和参数 URI 下方的第一级

      String expression = "/*/*[@URI]";
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-24
        • 1970-01-01
        • 2021-07-29
        • 1970-01-01
        • 1970-01-01
        • 2014-02-15
        相关资源
        最近更新 更多