2010-02-15 49 views
10

我想Groovy創建一個函數,它下面創建一個XPath函數:如何在Groovy

  1. 接受在運行2個參數(XML字符串,和XPath查詢)
  2. 返回結果爲文本

這可能是很簡單,但對於兩個障礙:

  1. 這有可能在常規
  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」是運行時參數。我現在怎麼得到這個返回結果(作爲一個字符串)?

感謝

回答

14

你可以做這樣的事情:

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

+0

蒂姆,非常感謝你的幫助。這對我來說是一個巨大的節省時間。 – 2010-02-16 10:12:22

+0

你剛剛救了我的生命 – 2016-10-19 14:08:01

0

這就是我最終定居,這應該爲我的目的工作:

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) 
+0

不錯的片段。出於某種原因,對於我的示例xhtml,執行似乎停滯在builder.parse,但:沒有明顯的CPU使用率或I/O。某種網絡超時,也許? – 2017-04-06 20:23:37