2013-05-14 2 views
0

자식 요소에 별도의 이름 공간이있는 아래 형식과 같은 jaxb를 사용하여 XML을 만들려고합니다.jaxb, 자식 요소에 대한 별도의 네임 스페이스

<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> 

내 수업

@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){ } 

하지만 난 XML 아래, 아이 스키마 루트 레벨에있는 경우처럼 생성 얻고있다.

<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> 

나는 단지 루트 요소의 네임 스페이스를 얻을, 내가 XML을 생성 할 때 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; 

에 정의 @xmlschema, 자식 요소에 대한 이름 공간이 생성되지 않아요 있습니다.

+0

귀하의 질문은 무엇입니까? – hoaz

+0

XML을 생성하는 동안 자식 네임 스페이스를 가져와야하지만 –

+0

XML이 유효합니다. 왜 자식 요소에 NS가 있어야합니까? – hoaz

답변

2

저는 "xmlns"속성을 객체 (childnode) Element1과 Element2에 추가하여 해결했습니다.

class Elemenet1 

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

    public void setXmlns(String namespace){}; 

    public String getXmlns(){}; 

출력

<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

이런 식으로하면 무엇을 얻을 수 있습니까? 아무런 이득이 없으면 복잡성이 커지고 있습니다. –

+0

서비스가 내게 노출되어 있으므로 서비스 동작을 변경할 수 없습니다. 나는 여기서 복잡성에 대해 알고 싶어한다. –

+0

JAXB를 사용하고 있으므로 원하는 네임 스페이스를 선언 한 도메인의 패키지에 package-info.java를 추가하면됩니다. [여기를 참고하십시오] (http://stackoverflow.com/questions/7501494/what-is-jaxb-generated) -package-info-java). Jaxb는 자동으로 xmlns 속성을 거기에 넣을 것이고 네임 스페이스 선언은 한 곳에서 유지하면된다. – David

0

여기서 생성되는 것은 xmlns:ns2="http://childelementnamespace/"이 맨 위입니다. 이것은 네임 스페이스를 선언하고이 형식으로 사용됩니다. <ns2:Element2> 여기서 ns2를 사용하면 이전에 선언 된 tha namspace가 사용됩니다.

기대하고있는 것과 얻고있는 것은 정확히 다른 장소에서 선언 된 것과 똑같습니다. 동일한 네임 스페이스를 두 번 이상 선언하지 않기 때문에 jaxB 메서드가 더 정확합니다.

+0

하위 네임 스페이스가 루트 요소의 일부가 아니라 자식 노드의 일부가 될 것으로 예상합니다. 기본적으로 자식 노드에서 자식 네임 스페이스를 가져 오는 솔루션을 찾으려고 노력하고 있으며 당신이 말한 것처럼 그것은 나를 위해 작동하지 않습니다. 비누 요청 (내 질문 상단에 참조하십시오) 어디에 자식 노드에 인접한 네임 스페이스가 필요하며 접두사가 필요하지 않습니다. 자식 노드에서이 네임 스페이스가 없으면 서비스 오류가 발생합니다. –

+0

그 방법이 잘못 되었기 때문에 "원하는 방식"으로 작동하지 않습니다. 이 때문에 서비스가 실패하면 서비스에 문제가있을 수 있습니다. 네임 스페이스가있는 곳에서 서비스가 실패하지 않아야합니다. –

0

이 임시 솔루션입니다. 이것은 XML 문서를 비 정렬화할 때 중대한 문제를 유발합니다. 그러나 마샬 및 언 마샬 프로세스에도 다른 패키지를 사용할 수 있습니다.

관련 문제