2013-05-14 5 views
0

J'essaye de créer du XML en utilisant le format jaxb comme ci-dessous, où l'élément enfant a un espace de noms séparé.jaxb, espace de noms séparé pour l'élément enfant

<soap:Envelope xmlns:soap="http://demo.org/soap/envelope/"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
     <soap:Header> 
      <element1 xmlns="http://childnamespacehere"> 
      <att1>test</att1> 
      <att2>test</att2> 
      </element1>  
    </soap:Header> 
    <soap:Body> 
     <element2 xmlns="http://childnamespacehere"> 
      <att1>test</att1> 
      <att2>test</att2> 
     </element2 > 
    </soap:Body> 
</soap:Envelope> 

ma classe

@XmlRootElement(name = "soap:Envelope", namespace = "http://schemas.xmlsoap.org/soap/envelope/") 
    public class Envelope  

    private Element1 element1; 

    private Element2 element2; 

    @XmlElementWrapper(name = "soap:Header") 
    @XmlElement(name = "Element1", namespace = "http://childelementnamespace/") 
    public void setElement1(Element1 element){ } 

    @XmlElementWrapper(name = "soap:Body") 
    @XmlElement(name = "Element2" , namespace = "http://childelementnamespace/") 
    public void setElement2(Element2 element){ } 

mais je reçois XML généré comme ci-dessous, où le schéma de l'enfant est au niveau de la racine.

<soap:Envelope xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns2="http://childelementnamespace/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <soap:Header> 
      <ns2:Element1> 
       <att1>value</att1> 
       <att2>value</att2> 
      </ns2:Element1> 
     </soap:Header> 
     <soap:Body> 
      <ns2:Element2> 
       <att1>value</att1> 
       <att2>value</att2> 
      </ns2:Element2> 
     </soap:Body> 
    </soap:Envelope> 

j'ai @xmlschema défini dans package-info.java

@XmlSchema(namespace = "http://schemas.xmlsoap.org/soap/envelope/", 
    xmlns = { @javax.xml.bind.annotation.XmlNs(prefix = "Element1", namespaceURI = "http://childelementnamespace"), 
      @javax.xml.bind.annotation.XmlNs(prefix = "Element2", namespaceURI = "http://childelementnamespace") }, 
      elementFormDefault = XmlNsForm.QUALIFIED) 

    package com.model; 

    import javax.xml.bind.annotation.XmlNsForm; 
    import javax.xml.bind.annotation.XmlSchema; 

quand je produis xml, l'espace de noms pour les éléments enfants ne reçoivent pas généré, je ne reçois que espace de noms pour l'élément racine.

+0

et quelle est votre question? – hoaz

+0

J'ai besoin d'avoir un espace de noms enfant pendant la génération du XML, mais je ne suis pas –

+0

le XML que vous obtenez est valide, pourquoi avez-vous besoin de votre NS pour résider dans des éléments enfants? – hoaz

Répondre

2

Je l'ai résolu en ajoutant l'attribut "xmlns" aux objets (childnode) Element1 et Element2.

class Elemenet1 

    @XmlAttribute(name="xmlns") 
    String xmlns = "http://childnamespacehere"; 

    public void setXmlns(String namespace){}; 

    public String getXmlns(){}; 

Sortie

<soap:Envelope xmlns:soap="http://demo.org/soap/envelope/"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
     <soap:Header> 
      <element1 xmlns="http://childnamespacehere"> 
      <att1>test</att1> 
      <att2>test</att2> 
      </element1>  
    </soap:Header> 
    <soap:Body> 
     <element2 xmlns="http://childnamespacehere"> 
      <att1>test</att1> 
      <att2>test</att2> 
     </element2 > 
    </soap:Body> 
</soap:Envelope> 
+0

Qu'est-ce que vous gagnez à le faire de cette façon, Vous augmentez la complexité pour aucun gain. –

+0

le service est exposé à moi, donc je ne peux pas changer le comportement du service. Je suis curieux de connaître la complexité ici. –

+0

Puisque vous utilisez JAXB, ajoutez simplement un package-info.java au package de votre domaine qui déclare l'espace de noms que vous voulez [voir ici] (http://stackoverflow.com/questions/7501494/what-is-jaxb-generated -package-info-java). Jaxb mettra automatiquement l'attribut xmlns là pour vous, et vous n'avez qu'à maintenir les déclarations d'espace de noms d'un endroit. – David

0

Où vous dites ce qui est généré est xmlns:ns2="http://childelementnamespace/" en haut, c'est déclarer l'espace de noms et utilisé de cette façon <ns2:Element2> en utilisant ns2 ici utilise tha namspace déclaré précédemment.

Donc ce que vous attendez et ce que vous obtenez sont exactement les mêmes que ceux que vous venez de déclarer à différents endroits, la méthode jaxB est plus correcte car elle ne déclare pas le même espace de noms plus d'une fois.

+0

Je m'attends à ce que l'espace de nommage enfant fasse partie du noeud enfant et ne fasse pas partie de l'élément racine. fondamentalement j'essaye de trouver la solution pour obtenir l'espace de nom d'enfant au noeud d'enfant, et comme vous l'avez dit cela ne fonctionne pas pour moi. C'est une demande de savon (veuillez vous référer au début de ma question) où il faut un espace de noms adjacent à child-node et qui ne nécessite aucun préfixe, si je n'ai pas cet espace de noms au nœud enfant j'obtiens une erreur du service. –

+0

Cela ne fonctionne pas pour vous "comme vous le voulez" parce que c'est faux. Si votre service échoue à cause de cela, je pense qu'il pourrait y avoir quelque chose de mal dans votre service. Où l'espace de noms réside ne devrait pas échouer dans votre service. –

0

Ceci est une solution temporaire. Cela déclenche des problèmes majeurs lorsque vous souhaitez unmarshall un document XML. Mais vous pouvez aussi utiliser différents paquets pour marshall et unmarshall.