2017-01-09 8 views
3

unmarshallルート要素を知らなくても実現できません。例えば。私はいつも@XmlRootElement修正するために必要なのです未知の@XmlRootElementを持つJaxb Unmarshall

// @XmlRootElement ?? 
public class Container 
    implements Serializable 
{ 
    private Bar bar; 
} 

<foo> 
    <bar/> 
</foo> 

または

<bar> 
    <bar/> 
</bar> 

等...

は、私のようなクラスの非整列化の結果をマップしたいです。
@ XmlRootElementを実行時に成功することなく設定する方法を検索しました。何か案が?

私は春のバッチのコンテキストで、私は自分の選択のアンマーシャラーを使用できます。

注:hereを示したように、私はpossiblesルート名の名前がわからないので、私は@XmlElementDeclまたはObjectFactoryを使用することはできません。

+0

アンマーシャリングの最終結果はどうなると思いますか? –

+0

答えをありがとう、私は質問を編集しました。 –

+0

[JAXBは複数の "ルート"要素を扱うことができますか?](http://stackoverflow.com/questions/12915968/can-jaxb-handle-multiple-root-elements) – ulab

答えて

2

は彼のアプローチを適応:https://stackoverflow.com/a/33824472/181336

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBElement; 
import javax.xml.bind.Unmarshaller; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.transform.stream.StreamSource; 
import java.io.ByteArrayInputStream; 
import java.io.InputStream; 
import java.io.Serializable; 

public class Test { 

    @XmlAccessorType(XmlAccessType.PROPERTY) 
    public static class Bar { 
     private String name; 

     public String getName() { 
      return name; 
     } 

     @XmlElement 
     public void setName(String name) { 
      this.name = name; 
     } 
    } 

    @XmlAccessorType(XmlAccessType.PROPERTY) 
    public static class Container implements Serializable { 
     private Bar bar; 

     public Bar getBar() { 
      return bar; 
     } 

     @XmlElement 
     public void setBar(Bar bar) { 
      this.bar = bar; 
     } 
    } 

    public static void main(String[] args) throws Exception { 
     JAXBContext jaxbContext = JAXBContext.newInstance(Container.class); 
     String xml = "<foo><bar><name>Barry</name></bar></foo>"; 
     Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
     InputStream is = new ByteArrayInputStream(xml.getBytes()); 
     JAXBElement<Container> barWrapperElement = unmarshaller.unmarshal(new StreamSource(is), Container.class); 
     Container container = barWrapperElement.getValue(); 

     System.out.println(container.getBar().getName()); 
    } 
} 

それは働きます!今までに、通過をXML

+0

これで、複数の匿名ルート要素を扱うことができましたか? –

+0

はい、ありがとうございます。春のバッチでは、[late-binding](http://stackoverflow.com/a/18693233/3042945)を使って 'StaxEventItemReader'の' fragmentRootElementName'をパラメータ化しました。この 'fragmentRootElementName'は、私の例では' foo'または 'bar'です。 'StaxEventItemReader'はドキュメントのルート名を気にしません(例えば' root'、 'root2')。私は完全な解決策で投稿を行います。 –

+1

それはクールだ! –

0

は、ルート要素を持っている、あなたが言及したXMLはので、ここで2つのファイル

<foo> 
    <bar/> 
</foo> 

または

<bar> 
<bar/> 

を持って次の2人のルート名FOOを持っているか、バーので、2つを作成しますこれまでのルート名であればそのクラスを呼び出すクラス

+0

私は事前にルートの名前を知らない。それで私はその名前を使ってクラスを作ることができないのです。私が言及したXMLは、私が本当に達成したいと思うものの最小限のバージョンです。 –

関連する問題