Question

Lorsque j'utilise ce code pour générer du code XML, j'ai analysé (et modifié) avec XmlParser

XmlParser parser = new XmlParser()
def root = parser.parseText(feedUrl.toURL().text)
def writer = new StringWriter()
new XmlNodePrinter(new PrintWriter(writer)).print(root)
println writer.toString()

les déclarations d'espace de nom sur le nœud racine ne sont pas imprimées, même si elles figurent dans le toString () de racine ... des idées?

Était-ce utile?

La solution

On dirait qu'il dénormalise la sortie et inclut le contexte de l'espace de noms avec les nœuds qui ont réellement besoin du contexte de l'espace de noms.

Par exemple, la page Web de cette question contient l’espace de noms creativeCommons incorporé:

<feed xmlns="http://www.w3.org/2005/Atom" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:thr="http://purl.org/syndication/thread/1.0">
  <!-- snip -->
  <creativeCommons:license>http://www.creativecommons.org/licenses/by-nc/2.5/rdf</creativeCommons:license>
  <!-- snip -->
</feed>

Lorsque vous exportez le XML avec ce script:

def root = new XmlParser().parseText("http://stackoverflow.com/feeds/question/227447".toURL().text)
println new XmlNodePrinter().print(root)

Cela finit par déplacer l'espace de noms vers le nœud de licence qui a besoin de cet espace de noms. Pas très grave dans ce cas car il n'y a qu'un seul nœud dans cet espace de noms. Si la plupart des fichiers XML étaient des espaces de noms, cela ferait probablement beaucoup plus souffrir.

<feed xmlns="http://www.w3.org/2005/Atom">
  <!-- snip -->
    <creativeCommons:license xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule">
http://www.creativecommons.org/licenses/by-nc/2.5/rdf
  </creativeCommons:license>
  <!-- snip -->
</feed>

Si vous voulez réellement normaliser les noeuds, vous devez apporter quelques modifications à XmlNodePrinter afin d'effectuer 2 passages via XML, d'abord pour rassembler tous les espaces-noms utilisés et pour les sortir ensuite au sommet plutôt qu'à l'intérieur de chacun d'eux. noeud de nom-espace. Le code source groovy est en fait assez lisible et ne serait pas si difficile à modifier si vous en aviez réellement besoin.

Autres conseils

Je viens d'avoir le même problème et après quelques manipulations, j'ai trouvé une solution de contournement.

Vous utilisez XmlSluper au lieu de XmlParser et utilisez StreamingMarkupBuilder au lieu de XmlNodePrinter . Ensuite, vous tirez parti de la fermeture dans bind et utilisez la variable intégrée mkp pour déclarer les espaces de nom.

Par exemple; en utilisant l'exemple source xml de Ted vu de dessus:

def root = new XmlSlurper().parseText("http://stackoverflow.com/feeds/question/227447".toURL().text))
def outputBuilder = new StreamingMarkupBuilder()
String result = XmlUtil.serialize(outputBuilder.bind {
    mkp.declareNamespace('':'http://www.w3.org/2005/Atom')
    mkp.declareNamespace('creativeCommons':'http://backend.userland.com/creativeCommonsRssModule')
    mkp.declareNamespace('re':'http://purl.org/atompub/rank/1.0')
    mkp.yield root }
)
println result

Résultats en:

<?xml version="1.0" encoding="UTF-8"?><feed xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns="http://www.w3.org/2005/Atom" xmlns:re="http://purl.org/atompub/rank/1.0">
<title type="text">How do I print a groovy Node with namespace preserved? - Stack Overflow </title>
<link rel="self" type="application/atom+xml" href="http://stackoverflow.com/feeds/question/227447"/>
<link rel="alternate" type="text/html" href="http://stackoverflow.com/questions/227447"/>
<subtitle>most recent 30 from stackoverflow.com</subtitle>
<updated>2011-02-16T05:13:17Z</updated>
<id>http://stackoverflow.com/feeds/question/227447</id>
<creativeCommons:license>http://www.creativecommons.org/licenses/by-nc/2.5/rdf</creativeCommons:license>
<entry>
<id>http://stackoverflow.com/questions/227447/how-do-i-print-a-groovy-node-with-namespace-preserved</id>
<re:rank scheme="http://stackoverflow.com">2</re:rank>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top