2010-04-30 5 views
1

J'écris du code où je récupère du XML à partir d'une API Web, puis j'analyse le XML en utilisant Groovy. Malheureusement, il semble que XmlParser et XmlSlurper pour Groovy dépouillent les caractères newline des attributs des nœuds lorsque .text() est appelé.L'analyse XML dans les bandes Groovy attribue de nouvelles lignes

Comment puis-je obtenir le texte de l'attribut incluant les nouvelles lignes?

Exemple de code:

def xmltest = ''' 
<snippet> 
    <preSnippet att1="testatt1" code="This is line 1 
    This is line 2 
    This is line 3" > 
     <lines count="10" /> 
    </preSnippet> 
</snippet>''' 

def parsed = new XmlParser().parseText(xmltest) 
println "Parsed" 
parsed.preSnippet.each { pre -> 
     println pre.attribute('code'); 
} 


def slurped = new XmlSlurper().parseText(xmltest) 
println "Slurped" 
slurped.children().each { preSnip -> 
    println [email protected]() 
    } 

la sortie est:

Parsed 
This is line 1 This is line 2 This is line 3 
Slurped 
This is line 1 This is line 2 This is line 3 

Ok, j'ai pu convertir le texte avant analysables, puis reconvertir après, à la:

def newxml = xmltest.replaceAll(/code="[^"]*/) { 
    return it.replaceAll(/\n/, "~#~") 
} 
def parsed = new XmlParser().parseText(xmltest) 
def code = pre.attribute('code').replaceAll("~#~", "\n") 

Pas mon hack préféré, mais ça ira jusqu'à ce qu'ils corrigent leur sortie XML.

Répondre

2

Les nouvelles lignes ne sont pas prises en charge dans les attributs - elles proviennent de la spécification XML. Ils finissent par être «normalisés», ce qui dans ce cas signifie qu'ils sont remplacés par un caractère espace. Voir cette section de la spécification: http://www.w3.org/TR/REC-xml/#AVNormalize

Mon équipe avait ce problème et notre solution était de passer à l'utilisation d'éléments plutôt que d'attributs.

+0

C'est bon à savoir, et j'ai informé ceux qui génèrent le XML qu'ils le font mal ... toute chance que vous avez un moyen de remplacer seulement les retours chariot dans les attributs d'un fichier XML avec un autre Chaîne de caractères que je peux mettre RETOUR au retour de chariot quand je lis le texte? C'est un hack qui résoudrait ça en attendant le vrai changement XML. – billjamesdev

+0

Vous pouvez essayer de jouer avec des références de caractères et, si cela ne fonctionne pas, des séquences remplaçables personnalisées que vous manipulez vous-même. – SteveD

0

Je pense que vous interprétez mal la spécification XML. Les retours à la ligne sont autorisés dans les valeurs d'attribut, mais si la valeur déclarée de l'attribut est l'un des types de jetons, alors les espaces sont normalisés.

Questions connexes