Как создать функцию XPath в Groovy - PullRequest
11 голосов
/ 15 февраля 2010

Я пытаюсь создать в 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 "являются параметрами времени выполнения.Как получить это сейчас, чтобы вернуть результат (в виде строки)?

Спасибо

Ответы [ 2 ]

14 голосов
/ 16 февраля 2010

Вы можете сделать что-то вроде этого:

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 Docs), чтобы узнать, как перебрать запросы XPath, которые будут возвращать несколько результатов:

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

0 голосов
/ 16 февраля 2010

Это было то, к чему я в конечном итоге остановился, и это должно работать для моих целей:

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 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...