2016-12-16 6 views
0

私は変更できない単純なXSDを持っています(サードパーティから提供されています)。私は、XSDのJavaクラスを生成するためにXJCを使用しようとしています。非常に簡略化されたXSDは次のとおりです。JAXB with nillable root

<?xml version="1.0" encoding="UTF-8" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="receive" nillable=true /> 
</xs:schema> 

オブジェクトをXMLにマーシャリングして、要素をnilに設定する必要があります。 XJCでJavaクラスを生成すると、JAXBElement<Object> createReceive(Object)メソッドを持つObjectFactoryが得られます。ただし、@XmlElementRoot注釈はありません。私はthis question and answerを見ましたが、サードパーティのプラグインにもアクセスできません。バインディングやその他のネイティブソリューションによる解決策はありますか?

答えて

1

これは、私が作っているよりもはるかに簡単だったか、リンクされた質問よりもはるかに簡単でした。私は@XmlElementRootがなかったという事実につらかったが、それは不必要であることが判明した。

simple.xsd:コマンドラインで

<?xml version="1.0" encoding="UTF-8" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="receive" nillable="true" /> 
</xs:schema> 

は、ObjectFactoryを生成.../jdk1.8/bin/xjc simple.xsdを走りました。 ObjectFactoryの1つの方法は、記号public JAXBElement<Object> createReceive(Object value)を持っていました。所望に応じて

package aTest; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBElement; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Marshaller; 

import generated.ObjectFactory; 

public class start { 

    public static void main(final String[] args) { 
    final ObjectFactory factory = new ObjectFactory(); 
    final JAXBElement<Object> element = factory.createReceive(null); 

    try { 
     final JAXBContext jaxbContext = JAXBContext.newInstance(JAXBElement.class); 
     final Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 

     jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 

     jaxbMarshaller.marshal(element, System.out); 
    } catch (final JAXBException e) { 
     e.printStackTrace(); 
    } 
    } 
} 

これは以下の出力を生成した:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<receive xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/> 
を実装コードの下に作成