2010-02-15 5 views
10

Ich versuche, eine Funktion in Groovy zu erstellen, die die folgenden:Wie kann ich eine XPath-Funktion in Groovy erstellen

  1. akzeptiert 2 Parameter zur Laufzeit (eine Reihe von XML und eine XPath-Abfrage)
  2. das Ergebnis Kosten als Text

Dies ist wahrscheinlich recht einfach, aber für zwei Hindernisse:

  1. Dies muss in groovy
  2. geschehen ich nichts wie nichts wissen über groovy oder Java ...

Diese so weit ist, wie ich durch Hacking verschiedene Bit-Code zusammen haben, aber jetzt bin ich fest:

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) 

wobei "xml" und "Ausdruck" Laufzeitparameter sind. Wie bekomme ich das jetzt, um das Ergebnis (als String) zurückzugeben?

Dank

Antwort

14

Sie können etwas tun:

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') 

einen Blick auf diese Seite haben (früher Teil der Groovy Docs), wie über XPath-Abfragen in einer Schleife, die mehrere Ergebnisse angezeigt werden können:

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

+0

Tim, vielen Dank für Ihre Hilfe. Das war eine enorme Zeitersparnis für mich. –

+0

Sie haben gerade mein Leben gerettet –

0

Das war, was ich für eventuell angesiedelt, die für meine Zwecke funktionieren sollte:

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

Nice Snippet. Aus irgendeinem Grund scheint die Ausführung bei meinem Beispiel-xhtml jedoch bei builder.parse stehen geblieben zu sein: keine merkliche CPU-Auslastung oder I/O. Irgendeine Art von Netzwerk-Timeout, vielleicht? –

Verwandte Themen