2009-11-04 3 views
11

J'implémente un sous-protocole homebrew de XMPP, et j'utilise une combinaison de StAX et de JAXB pour analyser/classer les messages. Et quand je marshall un message je me retrouve avec des tas de déclarations d'espace de noms unneded:JAXB ajoutant des déclarations d'espace de noms inutiles aux balises

<ns2:auth xmlns:ns2="urn:ietf:params:xml:ns:ilf-auth" 
    xmlns:ns4="ilf:iq:experiment:power" xmlns:ns3="ilf:iq:experiment:init" 
    xmlns:ns5="ilf:iq:experiment:values" xmlns:ns6="ilf:iq:experiment:result" 
    xmlns:ns7="ilf:iq:experiment:stop" xmlns:ns8="ilf:iq:experiment:end"> 
    [email protected]</ns2:auth> 

au lieu de:

<ns:auth xmlns:ns="urn:ietf:params:xml:ns:ilf-auth>[email protected]</ns:auth> 

Est-il possible de transformer celle de? Tous ces espaces de noms sont utilisés dans différents messages qui sont rassemblés/décompilés par JAXB, mais chaque message utilise un espace de nom.

PS. Je ne suis pas un expert XML s'il vous plaît ne me découragez pas si j'ai fait une erreur stupide;)

+0

Ceci est complètement inacceptable pour les documents juridiques qui doivent être conservés pendant le transport pour maintenir leur intégrité. JAXB est un moyen de rendre les choses simples plus complexes –

+0

JAXB simplifie l'analyse et la production XML. J'ai fait un projet qui utilise à la fois JAXB et dom4j (dans deux parties différentes) et la différence est grande. –

Répondre

10

La fonctionnalité que vous recherchez a été demandée comme une amélioration sur le tracker de problème JAXB dans issue 103. L'amélioration a été refusée, car les auteurs JAXB trouvent qu'il est trop coûteux de parcourir l'arborescence d'objets une fois de plus avant que la sérialisation réelle ne commence à déterminer quels espaces de noms sont réellement requis.

Bien que plutôt gonflés, les espaces de noms inutiles n'invalident pas le document XML. Si vous devez vraiment sauvegarder les quelques octets et que le coût de calcul supplémentaire est abordable, il devrait être facile d'écrire votre propre processeur/filtre XML, qui prend la sortie JAXB, analyse le document et écrit un nouveau document sans les définitions d'espace de noms inutilisées .

+2

[XSLT pour effectuer cette transformation] (http://stackoverflow.com/a/4594626/2019259), et si vous utilisez CXF: http://cxf.apache.org/docs/xslt-feature.html –

Questions connexes