【问题标题】:Modify XPath expressions via Java?通过 Java 修改 XPath 表达式?
【发布时间】:2016-05-02 17:54:33
【问题描述】:

我有//*[@id='test-id' and @some-other-attribute='some-value’] 类型的XPath 表达式。我想把它转换成//*[@resourceId='android:id/test-id' and @some-other-attribute='some-value’]

我似乎找不到任何库函数来做到这一点。我不想求助于正则表达式查找和替换字符串 - 寻找一种结构化的方式来做到这一点。感谢任何指针。

注意:我不希望针对 XML 文件评估 XPath 表达式。我希望修改 XPath 表达式本身,而不使用字符串替换。

更新:

按照 kjhughes@ 的建议,我使用以下代码来获取 xpath 表达式的解析树。

Processor proc = new Processor(false);
XPathCompiler p = new XPathCompiler(proc);
XPathExecutable exec = p.compile("//*[@id='test-id' and @some-other-attribute='some-value']");
exec.getUnderlyingExpression().getInternalExpression().explain(new StandardLogger());

这会产生:

<filterExpression>
   <slash simple-step="true">
      <root/>
      <axis name="descendant" nodeTest="element()"/>
   </slash>
   <operator op="and">
      <operator op="=" cardinality="one-to-one">
         <data>
            <axis name="attribute" nodeTest="attribute(Q{}id)"/>
         </data>
         <literal value="test-id" type="xs:string"/>
      </operator>
      <operator op="=" cardinality="one-to-one">
         <data>
            <axis name="attribute" nodeTest="attribute(Q{}some-other-attribute)"/>
         </data>
         <literal value="some-value" type="xs:string"/>
      </operator>
   </operator>
</filterExpression>

解析 XML 节点并重新组合表达式是我唯一的选择吗?或者有没有我想念的更短的方法?

(我仍然需要弄清楚是否将 XML 转换回 Xpath 表达式是微不足道的,或者它是否会涉及任何诡计。)

【问题讨论】:

    标签: java xml xpath


    【解决方案1】:

    如果您想以编程方式重写 XPath 表达式,则需要查看 XPath 解析器。示例见https://www.w3.org/2002/11/xquery-xpath-applets/xpathApplet.html

    【讨论】:

      【解决方案2】:

      您可以使用以下两个库来解析 XPath 表达式:

      1. 撒克逊人的net.sf.saxon.s9api.XPathCompiler。您可能还想在已编译的 XPath 上试验 explain() interface
      2. The Jaxen XPath Engine for Java。但是请注意,Jaxen 的支持/稳定性有 vacillated over time

      如果有选择,我会针对 Saxonica 的库进行开发。

      【讨论】:

      • 感谢您的指点。我检查了 Saxonica 并进入了 explain() 部分 - 但需要一些帮助才能继续前进。更新了我的问题,因为我需要发布格式化的代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2012-12-30
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多