web-dev-qa-db-fra.com

Préfixes d'espace de noms JAXB manquants

J'ai généré des classes Java à partir de XSD, tout fonctionne très bien d'un point de vue anti-marshalling.

Cependant, lorsque je rassemble des classes JAXB, j'obtiens ce qui suit:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<message xmlns="http://poc.cmc.com/ScreenLayout">
    <Data>
        <Type>Sample</Type>
     . . .
</message>

Mais, j'ai besoin

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns0:message xmlns:ns0="http://poc.cmc.com/ScreenLayout">
    <ns0:Data>
        <ns0:Type>Sample</ns0:Type>
    . . .

comment puis-je contrôler cela à partir de Java?

Merci beaucoup

30
Arthur .

Vous pouvez utiliser le @XmlSchema annotation sur un package-info classe pour attribuer un préfixe à l'espace de noms:

@XmlSchema(
    namespace = "http://poc.cmc.com/ScreenLayout",
    elementFormDefault = XmlNsForm.QUALIFIED,
    xmlns={@XmlNs(prefix="ns0", namespaceURI="http://poc.cmc.com/ScreenLayout")})    
package your.package;


import javax.xml.bind.annotation.*;
34
bdoughan

Je ne peux pas poster ceci en tant que commentaire!

parce que l'application consommatrice est très stupide et a besoin du préfixe

Dans ce cas, l'application stupide ne consomme pas vraiment de XML. Jetez un œil à ce lien http://bdoughan.blogspot.com/2010/08/jaxb-namespaces.html et jouez avec les options de l'espace de noms. Plus précisément

@XmlSchema (
   xmlns = {
         @javax.xml.bind.annotation.XmlNs(prefix = "ns1", namespaceURI="http:test"),
         @javax.xml.bind.annotation.XmlNs(prefix = "xsd", namespaceURI="http:www.w3.org2001XMLSchema")
   },
   namespace = "http:test",
   elementFormDefault = XmlNsForm.UNQUALIFIED,
   attributeFormDefault = XmlNsForm.UNSET
)

utilisé dans un fichier package-info.Java.

@XmlType(namespace="http://www.example.org/type")

Utilisé sur une déclaration de classe

@XmlElement(namespace="http://www.example.org/property")

Utilisé sur une propriété.

Une combinaison ou une seule de ces options peut vous donner ce que vous voulez. Cependant, vous devez comprendre que vous livrez une bataille difficile lorsque vous passez d'un xml valide à un xml qui doit contenir un préfixe d'espace de noms spécifique sur tous les éléments.

8
Heathen

Selon la spécification XML, les deux xml sont identiques, car xmlns = "" définit l'espace de noms par défaut qui s'applique aux éléments actuels et à tous les éléments enfants. Les analyseurs XML devraient vous donner le même DOM ou SAX dans les deux cas

2
Sergey Aslanov