2011-08-11 16 views

Odpowiedz

25

Oto odpowiedni fragment:

def node = new XmlSlurper().parseText(...) 
def foo = node.depthFirst().findAll { it.name() == 'div' && [email protected] == 'foo'} 

Kilka inne linki, które warto przeczytać:

+3

Nadszedł Groovy, nie GPath. Potrzebuję pojedynczego wyrażenia GPath. – yegor256

+3

Nie jestem pewien, co masz na myśli, ponieważ GPath w większości używa skomplikowanej składni z następującymi dodatkowymi symbolami: "..", która zwraca rodzicowi "*", który zwraca wszystkie dzieci "**", które działają jak głębokość pierwsza pętla "@", która służy do uzyskiwania dostępu do właściwości normalnego węzła dostępowego. –

+1

Szukam czegoś takiego jak '' ..div {it. @ Id == 'foo'} "', ale to nie działa. – yegor256

7

Poprzedniego poster dał Ci wszystko to jest wymagane: zakładając, że twój dokument został splądrowany xml, aby uzyskać

def foo = xml.path.to.div.find{[email protected] == 'foo'} 

, aby znaleźć pojedynczy wynik. Lub findAll, aby znaleźć wszystkie wyniki.

+0

'//' w XPath oznacza, że ​​nie znam dokładnej ścieżki do 'div' – yegor256

+1

ok. poprzedni plakat dał ci rozwiązanie: - użyj 'xml.depthFirst(). find {it.name() == 'div' && id. @ id == 'foo}' – winstaan74

+0

@ winstaan74 Jakie jest wyrażenie do uzyskania wszystkich elementy o określonej nazwie atrybutu? – raffian

1

czego potrzebujesz to:

def root = new XmlSlurper().parseText(<locOfXmlFileYouAreParsing>.toURL().text) 

def foundNode = root.'**'.find{ [email protected] == "foo" } 

jego podwójne *, który pozwoli Ci znaleźć go nie znając drogi. Przynajmniej tak to robię.

+1

Jak znaleźć pierwszą instancję węzła po nazwie elementu, zakładając, że jest więcej niż jeden? – raffian

+0

'xml. '**'. Find {it.name() == 'elementName'}' I to będzie pierwsze. –

1

naśladować wyraz // div [@ id = 'foo'] najbliżej, co można zrobić z GPath jest:

def xml = new XmlParser().parseText(text) 
xml.'**'.div.findAll { [email protected]=="foo" } 

do '**' jest niemal tak samo jak „//'w twoim XPath.

xml.'**'.div 

da wszystkie węzły typu div na dowolnym poziomie.

Później filtrowanie findAll() z podanym zamknięcia można uzyskać listę węzłów, jak to zrobić w przypadku XPath

Powiązane problemy