2009-12-04 9 views
1

J'ai un xml, et je ne peux pas analyser ce fichier avec xmlslurper. Voici une copie de mon fichier xml:groovy XmlSlurper pas analyser mon fichier xml

<Entrezgene-Set> 
<Entrezgene> 
<Entrezgene_summary>The protein encoded by this gene is a plasma glycoprotein of unknown function. The protein shows sequence similarity to the variable regions of some immunoglobulin supergene family member proteins. [provided by RefSeq]</Entrezgene_summary> 
</Entrezgene> 
</Entrezgene-Set> 

J'ai juste besoin d'obtenir le texte de <Entrezgene_summary>

Voici mon code:

def pubmedEfetch = { 

    def base = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?" 
    def qs = [] 
    qs << "db=gene" 
    qs << "id=1" 
    qs << "retmode=xml" 
    def url = new URL(base + qs.join("&")) 
    def connection = url.openConnection() 

    def result = [:] 

    if(connection.responseCode == 200){ 
    def xml = connection.content.text 
    def eFetchResult = new XmlSlurper().parseText(xml) 
    result.geneSummary = eFetchResult.Entrezgene-Set.Entrezgene.Entrezgene_summary 
    } 
    else{ 
    log.error("PubmedEfetchParserService.PubmedEsearch FAILED") 
    log.error(url) 
    log.error(connection.responseCode) 
    log.error(connection.responseMessage) 
    } 
    render result 
} 

Et mon message d'erreur:

Error 500: groovy.lang.MissingPropertyException: No such property: Entrezgene for class: java.util.Set 
Servlet: grails 
URI: /geneInfo/grails/genes/pubmedEfetch.dispatch 
Exception Message: No such property: Entrezgene for class: java.util.Set 
Caused by: groovy.lang.MissingPropertyException: No such property: Entrezgene for class: java.util.Set 
Class: GenesController 

Je ne vois pas où est ma faute?

J'essaie aussi: result.geneSummary = eFetchResult./Entrezgene-Set/.Entrezgene.Entrezgene_summary

Quelqu'un a une idée? Merci

Répondre

5

Vous n'avez pas besoin de déréférencer l'étiquette supérieure (Entersgene-Set>). Les œuvres suivantes pour moi dans groovyconsole:

xml = """<Entrezgene-Set> 
<Entrezgene> 
    <Entrezgene_summary>The protein encoded by this gene is a plasma glycoprotein of unknown function. The protein shows sequence similarity to the variable regions of some immunoglobulin supergene family member proteins. [provided by RefSeq] 
    </Entrezgene_summary> 
</Entrezgene> 
</Entrezgene-Set> 
""" 


def eFetchResult = new XmlSlurper().parseText(xml) 
x = eFetchResult.Entrezgene.Entrezgene_summary 
println "x is [${x}]" 

BTW, votre message d'erreur est causée en essayant d'utiliser un nom de propriété avec un tableau de bord en elle.

+1

Oui, vous avez absolument raison. Juste pour clarifier: 'eFetchResult.Entrezgene-Set.Entrezgene' est interprété par Groovy comme' eFetchResult.Entrezgene - Set.Entrezgene', ainsi le message d'erreur (Aucune telle Entrezgene pour la classe Set), donc le mettre entre guillemets fixerait ce . Cependant, comme Jean l'a souligné, l'élément XML racine ne doit pas (en fait, ne peut pas) être inclus dans le GPath. –

2

Merci, Je viens juste de régler mon problème avec votre aide:

  • en utilisant des guillemets, s'il y a un trait d'union dans mon élément xml (ex: result.test = eFetchResult.Entrezgene.'Entrezgene_track- par 'delete, la référence de l'étiquette supérieure (si je garde la référence de l'étiquette supérieure, les valeurs de ma carte sont vides - il est bon de savoir que :-)

Ici ma correction:

def pubmedEfetch = { 

    def base = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?" 
    def qs = [] 
    qs << "db=gene" 
    qs << "id=1" 
    qs << "retmode=xml" 
    def url = new URL(base + qs.join("&")) 
    def connection = url.openConnection() 

    def result = [:] 

    if(connection.responseCode == 200){ 
    def xml = connection.content.text 
    def eFetchResult = new XmlSlurper().parseText(xml) 
    result.geneSummary = eFetchResult.Entrezgene.Entrezgene_summary 
    } 
    else{ 
    log.error("PubmedEfetchParserService.PubmedEsearch FAILED") 
    log.error(url) 
    log.error(connection.responseCode) 
    log.error(connection.responseMessage) 
    } 
    render result 
} 
+0

Si vous avez un nom de propriété avec un tiret, le chemin habituel est de citer le nom de la propriété, c'est à dire: 'eFetchResult.'Entrezgene-set'.Entrezgene' :-) –