【问题标题】:How do I create an XPath function in Groovy如何在 Groovy 中创建 XPath 函数
【发布时间】:2010-02-15 18:16:48
【问题描述】:

我正在尝试在 Groovy 中创建一个执行以下操作的函数:

  1. 在运行时接受 2 个参数(一个 XML 字符串和一个 xpath 查询)
  2. 以文本形式返回结果

这可能很简单,但有两个障碍:

  1. 这必须在 groovy 中完成
  2. 我对 groovy 或 Java 几乎一无所知……

这是我通过将各种代码组合在一起得到的结果,但现在我被困住了:

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.*;

builder  = DocumentBuilderFactory.newInstance().newDocumentBuilder();
doc      = builder.parse(new ByteArrayInputStream(xml.bytes));
expr     = XPathFactory.newInstance().newXPath().compile(expression);
Object result = expr.evaluate(doc, XPathConstants.NODESET)

其中“xml”和“expression”是运行时参数。我现在如何得到这个以返回结果(作为字符串)?

谢谢

【问题讨论】:

    标签: java xpath groovy


    【解决方案1】:

    你可以这样做:

    import javax.xml.xpath.*
    import javax.xml.parsers.DocumentBuilderFactory
    
    def testxml = '''
        <records>
          <car name="HSV Maloo" make="Holden" year="2006">
            <country>Australia</country>
            <record type="speed">Production Pickup Truck with speed of 271kph</record>
          </car>
        </records>
      '''
    
    def processXml( String xml, String xpathQuery ) {
      def xpath = XPathFactory.newInstance().newXPath()
      def builder     = DocumentBuilderFactory.newInstance().newDocumentBuilder()
      def inputStream = new ByteArrayInputStream( xml.bytes )
      def records     = builder.parse(inputStream).documentElement
      xpath.evaluate( xpathQuery, records )
    }
    
    println processXml( testxml, '//car/record/@type' )
    

    查看此页面(以前是 Groovy 文档的一部分),了解如何遍历将返回多个结果的 XPath 查询:

    http://groovy.jmiguel.eu/groovy.codehaus.org/Reading+XML+with+Groovy+and+XPath.html

    【讨论】:

    • 蒂姆,非常感谢您的帮助。这为我节省了大量时间。
    • 你刚刚救了我的命
    【解决方案2】:

    这就是我最终解决的问题,应该适合我的目的:

    import javax.xml.xpath.*
    import javax.xml.parsers.DocumentBuilderFactory
    
    def processXml( String xml, String xpathQuery ) {
      def xpath = XPathFactory.newInstance().newXPath()
      def builder     = DocumentBuilderFactory.newInstance().newDocumentBuilder()
      def inputStream = new ByteArrayInputStream( xml.bytes )
      def records     = builder.parse(inputStream).documentElement
      def nodes       = xpath.evaluate( xpathQuery, records, XPathConstants.NODESET )
      nodes.collect { node -> node.textContent }
    
    }
    
    processXml( xml, query )
    

    【讨论】:

    • 不错的sn-p。出于某种原因,对于我的示例 xhtml,执行似乎在 builder.parse 处停止,但是:没有明显的 CPU 使用或 I/O。也许是某种网络超时?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多