2014-12-10 6 views
1

У меня есть этот код:перебрать все Xpath результатов

#!/usr/bin/groovy 

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

def testxml = ''' 
       <Employee> 
        <ID>..</ID> 
        <E-mail>..</E-mail> 
        <custom_1>foo</custom_1> 
        <custom_2>bar</custom_2> 
        <custom_3>base</custom_3> 
       </Employee> 
    ''' 

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, '//*[starts-with(name(), "custom")]') 

и вместо возвращения всех узлов (я обеспечил // в выражении Xpath), я получаю только первый узел. Как я могу изменить свой код, чтобы отобразить все соответствующие узлы?

ответ

2

в соответствии с документами http://docs.oracle.com/javase/7/docs/api/javax/xml/xpath/package-summary.html вы передаете evaluate, что вы хотите, что по умолчанию соответствует строке. Поэтому просить NodeSet:

xpath.evaluate(xpathQuery, records, XPathConstants.NODESET) 

и перебирать в результате NodeList:

def result = processXml(testxml, '//*[starts-with(name(), "custom")]') 
result.length.times{ 
     println result.item(it).textContent 
} 
+0

Спасибо, я интересно, если вы можете сделать все короче;) –