2011-12-15 3 views
3

私は複雑なオブジェクトを持っています通常の「APIは制御できません」から戻り値として戻ってきます。jaxb入れ子オブジェクトの外側のタグを抑制する

<APICall1> 
    <VeryComplexObject> 
    <VeryComplexObjectElements... > 
    </VeryComplexObject> 
</APICall1> 

問題ありません、私はちょうど

@XmlElement 
private VeryComplexObject VeryComplexObject; 

を使用して、それはいつものようにビジネスです:いくつかのAPIについては

は、返されたXMLがどのように見える呼び出します。

しかし、いくつかの呼び出しは戻りたい:

<APICall2> 
    <VeryComplexObjectElements... > 
</APICall2> 

私はアンマーシャリング用<VeryComplexObject>タグを抑制したが、内側の要素タグを取得するために使用できる注釈がありますか?あなたは、XML要素を無視するStreamFilterを活用することでこれを実現するためのStAXでJAXBを使用することができ

答えて

3

package forum8526002; 

import java.io.StringReader; 

import javax.xml.bind.*; 
import javax.xml.bind.annotation.*; 
import javax.xml.stream.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Foo.class); 

     XMLInputFactory xif = XMLInputFactory.newFactory(); 
     StringReader xml = new StringReader("<APICall2><VeryComplexObjectElements><Bar>Hello World</Bar></VeryComplexObjectElements></APICall2>"); 
     XMLStreamReader xsr = xif.createXMLStreamReader(xml); 
     xsr = xif.createFilteredReader(xsr, new Filter()); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     Foo foo = (Foo) unmarshaller.unmarshal(xsr); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.marshal(foo, System.out); 
    } 

    @XmlRootElement(name="APICall2") 
    static class Foo { 

     @XmlElement(name="Bar") 
     private String bar; 

    } 

    static class Filter implements StreamFilter { 

     @Override 
     public boolean accept(XMLStreamReader reader) { 
      return !(reader.isStartElement() && reader.getLocalName().equals("VeryComplexObjectElements")); 
     } 

    } 

} 
+1

おかげブレーズを、私は@XmlElementAntiWrapperような何かを期待していた認めますよ。私がこれを投稿した直後に、私は、VeryComplexObjectをサブクラス化して、私が望む効果を得ることができることに気付きました。それは必ずしも機能しませんが、このプロジェクトには十分です。ありがとう。 –

+0

その間にこれを行うより良い方法はありますか? – ppasler

関連する問題