2017-10-05 3 views
0

마샬링 할 객체가 있지만 스키마에 @XmlRootElement 어노테이션이 없습니다. 내 유스 케이스를 들어JaxB가 @XmlRootElement 어노테이션없이 요소를 정렬하는 동안 ns2 접두어를 제거합니다.

<Foo xmlns:ns2="http://Foo/bar" test1="Foo"> 
    <ns2:Element1>000000013</ns2:Element1> 
    <ns2:Element2>12345678900874357</ns2:Element2> 
</Foo> 

의 정렬 화 후

QName qName = new QName("", "Foo"); 
jaxb2Marshaller.marshal(new JAXBElement(qName, Foo.class, fooObj), new StreamResult(baos)); 

이 다음 XML 결과의 정렬 화를 내가없이 객체를 marhsall 싶습니다 동안

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "") 
public static class Foo 
{ 
    @XmlAttribute(name = "test1") 
    public final static String TEST_1 = "Foo"; 

    @XmlElement(name = "Element1", required = true) 
    protected String element1; 

    @XmlElement(name = "Element2", required = true) 
    protected String element2; 
} 

은 내가 jaxbElement를 지정하여 객체를 정렬 화 XML이 보이도록 ns2 접두어

<Foo xmlns="http://Foo/bar" test1="Foo"> 
    <Element1>000000013</Element1> 
    <Element2>12345678900874357</Element2> 
</Foo> 

접두어없이이 개체를 어떻게 정렬 할 수 있습니까?

미리 감사드립니다.

답변

0

먼저 잘못된 네임 스페이스에 Foo 요소를 만듭니다. 원하는 출력을보고 Foo 요소가 http://Foo/bar 네임 스페이스에 있어야합니다. 대신 첫 번째 인수로 빈 문자열을 전달하는, 당신은 QName를 만들 때 해당 네임 스페이스 URI를 지정,이 문제를 해결하려면 :

// Wrong 
QName qName = new QName("", "Foo"); 

// Right 
QName qName = new QName("http://Foo/bar", "Foo"); 

네임 스페이스에 대해 생성 된 ns2 접두사를 제거하려면, 당신은 설정해야 빈 문자열에 대한 접두어 네임 스페이스. @XmlSchema 특수 효과가있는 package-info.java 파일이있을 것입니다. 그것은 다음과 같아야합니다

@XmlSchema(namespace = "http://Foo/bar", 
      elementFormDefault = XmlNsForm.QUALIFIED, 
      xmlns = @XmlNs(prefix = "", namespaceURI = "http://Foo/bar")) 
package com.mycompany.mypackage; 

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

참고 : prefix = "" 설정 JAXB는 당신의 XML에 ns2로 생성 된 접두사 이름없이 xmlns 속성을 생성하게됩니다.

+0

고마워요! 나는 같은 해결책을 얻을 수 있었지만 그 이유를 이해하는 데 도움이되었습니다. –

관련 문제