2010-01-22 6 views
10

Tout en essayant d'analyser les flux RSS en Groovy, je trouve un exemple GPath utilisant des caractères génériques:Quelle est la syntaxe complète des expressions GPath de Groovy?

def text = """ 
<data> 
    <common-tables> 
    <table name="address"/> 
    <table name="phone"/> 
    </common-tables> 

    <special-tables> 
    <table name="person"/> 
    </special-tables> 

    <other-tables> 
    <table name="business"/> 
    </other-tables> 
</data> 
""" 

def xml = new XmlParser().parse(new ByteArrayInputStream(text.getBytes())) 
def tables = xml.'**'.table.findAll{ it.parent().name() == 
"special-tables" || it.parent().name 

(de http://old.nabble.com/Q:-Avoiding-XPath---using-GPath-td19087210.html)

Il ressemble à une utilisation amusante de l'opérateur 'spread-dot'. Je ne trouve aucune référence à cela sur le site Groovy, les livres, etc.

Comment cela fonctionne-t-il, et plus important encore, comment le découvrez-vous? Existe-t-il un XPath pour GPath 'Rosetta Stone'?

Répondre

18

Eh bien, comme d'habitude, le meilleur endroit pour trouver des informations est dans la source Groovy elle-même.
Le résultat d'une analyse est un objet groovy.util.slurpersupport.GPathResult.

Si vous regardez la source (fichier java ordinaire), vous verrez que la méthode getProperty (chaîne) a les opérateurs spéciaux suivants:

  • ".." qui retourne le parent
  • « * » qui retourne tous les enfants
  • « ** » qui agissent comme une première boucle de profondeur
  • « @ » qui est utilisé pour accéder à une propriété
  • l'accesseur noeud normal.

C'est tout, pas d'autres mots-clés magiques pour le moment.

+0

Excellent, merci! J'avais essayé de regarder la source mais je ne savais pas où chercher. –

3

Toutes ces chaînes sont traitées comme des propriétés. Aucun d'eux n'est réellement un opérateur.

Les appels sont acheminés via GPathResult#getProperty qui vérifie spécifiquement les opérateurs répertoriés dans la réponse de gizmo.

Questions connexes