2017-10-05 79 views
0

マーシャルするオブジェクトがありますが、スキーマに@XmlRootElement注釈はありません。JaxBが@XmlRootElementアノテーションなしで要素をマーシャリングする間にns2プレフィックスを削除します

@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; 
} 

これは私がすることなく、このオブジェクトをmarhsallしたい私のユースケースについて

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

を整列化した後、次のXMLになり

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

を整列化しているときに、私が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接頭辞を取り除くために、あなたが設定する必要があります名前空間接頭辞を空の文字列に変換します。 注釈を持つ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

ありがとうございます!私は同じ解決法に到達することができましたが、あなたの説明は理由を理解するのに役立ちました。 –

関連する問題