2016-03-24 11 views
0

私はJAXBで生成されたクラスを持っています。ルートタグクラスは以下に示すFooです。Javaから@XmlRootタグを動的に追加するにはどうすればよいですか?

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "input" 
}) 
@XmlRootElement(name = "Foo") 
public class Foo { 

    @XmlElement(name = "Input", required = true) 
    protected Too input; 

    public Too getInput() { 
     return input; 
    } 

    public void setInput(Too value) { 
     this.input = value; 
    } 
} 

以下のようなサブタグクラスがあります。

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "Bar", propOrder = { 
    "request" 
}) 

public class Bar { 

    @XmlElement(name = "Request", required = true) 
    protected List<RequestType> request; 

    public List<RequestType> getRequest() { 
     if (request == null) { 
      request = new ArrayList<RequestType>(); 
     } 
     return this.request; 
    } 

} 

バーをルートクラスとして使用してxmlを構築する必要がある場合があります。私はオブジェクトから文字列に変換するためにJaxb Marshallarを使用します。

public static String jaxbObjectToXMLString(Object obj) { 
     try { 
      final Marshaller m = JAXBContext.newInstance(obj.getClass()).createMarshaller(); 
      m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
      final StringWriter w = new StringWriter(); 
      m.marshal(obj, w); 
      return w.toString(); 
     } catch (JAXBException e) { 
      logger.error("Returning empty xml string", e); 
      return EMPTY_STR; 
     } 
    } 

@ XmlRootElement(name = "Bar")と記述すると、マーシャルできます。私はバーを私のルートタグにしたくないので、クラスにこれを追加したくない。私が渡しているオブジェクトに基づいてjaxbObjectToXMLString(Object obj)の内部でこれを行う方法がありますか?

if(obj instanceof Bar) { dynamically make bar as XmlRoot and generate xml} 
else if(obj instanceof Foo){ marshall as it is} 

答えて

1

一般的な方法は、XMLスキーマに複数のxs:要素を定義し、再度コンパイルすることです(xjc)。

@ XmlRootElementは2つのクラスには問題ありません。

<T> JAXBElement<T> wrap(String ns, String tag, T o){ 
    QName qtag = new QName(ns, tag); 
    Class<?> clazz = o.getClass(); 
    @SuppressWarnings("unchecked") 
    JAXBElement<T> jbe = new JAXBElement(qtag, clazz, o); 
    return jbe; 
} 

void marshal() throws Exception { 
    Foo foo = new Foo(); 
    //... 
    JAXBElement<Foo> jbe = wrap("", "Foo", foo); 
    JAXBContext jc = JAXBContext.newInstance(PACKAGE); 
    Marshaller m = jc.createMarshaller(); 
    m.marshal(jbe, ...); 
} 

これは、JAXBElementのに包まれたルート要素を定義することも可能です

関連する問題