Groovy XmlSlurper não analisar o meu arquivo xml
-
13-09-2019 - |
Pergunta
Eu tenho um xml, e eu não posso analisar este arquivo com XmlSlurper. Aqui uma cópia do meu arquivo 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>
Eu só preciso para obter o texto de <Entrezgene_summary>
Aqui meu código:
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
}
E a minha mensagem de erro:
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
Não vejo onde está a minha culpa?
Eu também tento: result.geneSummary = eFetchResult./Entrezgene-Set/.Entrezgene.Entrezgene_summary
Alguém tem uma idéia? Graças
Solução
Você não precisa excluir a referência o tag superior (Entersgene-Set>). Os seguintes trabalhos para me em 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, sua mensagem de erro é causada por tentar usar um nome de propriedade com uma pitada nele.
Outras dicas
Obrigado, Eu só resolver o meu problema com a sua ajuda:
- usando aspas, se houver um hífen no meu elemento xml (ex: '. ''. 'Result.test = eFetchResult.Entrezgene.'Entrezgene_track-info Gene-track Gene-track_geneid'),
- por exclusão, a referência superior tag (se eu manter a referência superior tag, meus valores do mapa estão vazias - é bom saber que: -)
Aqui a minha correção:
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
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow