2017-01-19 10 views
0

私はかなり複雑なXMLスキーマを持っています。私は、hyperjaxb3を使ってpojoのアノテーションを生成しています。私が親オブジェクトを持っていて、8または9の深い子オブジェクトであるかもしれない子オブジェクトの値をチェックしたい時があります。とにかく、jaxbアノテーションに基づいて特定のクラスの子オブジェクトのリストを取得するために、jaxbや他のツールを使用する方法はありますか?jaxbアノテーションを使用してアンマーシャリングされたオブジェクトをナビゲートすることはできますか?

私はクラスのインスタンスについてすべての子を検索するための再帰関数を書くことができますが、それは理想的ではありません。どんな助言もありがとう、ありがとう。 (jderegのjava-util例えば)は、すでにそこに少数があり、そしてJAXBIntrospectorはあなたのためのXmlRootElementで注釈を付けたオブジェクトを見つける -

答えて

0

あなたはオブジェクトツリーを自分で歩くためのコードを記述する必要はありません。あなたが他の注釈を探しているなら、もう少し作業が必要ですが、それほど多くはありません。例えば

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

    // Found objects 
    List<Foo.Bar> bars = new ArrayList<>(); 

    // Object name to look for 
    QName barName = new QName("", "bar"); 

    // Unmarshalled root object to introspect 
    Foo target = new Foo(new Foo.Bar()); 

    // Walk the object graph looking for "bar" elements 
    Traverser.traverse(target, o -> { 
     if (barName.equals(is.getElementName(o))) { 
      bars.add((Foo.Bar) JAXBIntrospector.getValue(o)); 
     } 
    }); 

    System.out.println(bars); 
} 

// 
// Some test objects 
// 

@XmlRootElement(name = "foo") 
public class Foo { 
    private Bar bar; 

    public Foo() { } 

    public Foo(Bar bar) { 
     this.bar = bar; 
    } 

    @XmlElement(name="bar") 
    public Bar getBar() { 
     return bar; 
    } 

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

    @XmlRootElement(name="bar") 
    public static class Bar { 
     String name = "kate"; 

     public String getName() { 
      return name; 
     } 

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

     @Override 
     public String toString() { 
      return "Bar{name='" + name + '\'' + '}'; 
     } 
    } 
}