2017-01-19 2 views
0

У меня довольно сложная схема XML, и я использую hyperjaxb3 для создания аннотаций pojo. Бывают случаи, когда у меня есть родительский объект и я хочу проверить значение дочернего объекта, который может быть 8 или 9 детей в глубину. Можно ли использовать jaxb или другой инструмент для получения списка дочерних объектов определенного класса на основе аннотаций jaxb?Можно ли использовать аннотации jaxb для навигации по объектам после их отмены?

Я мог бы написать рекурсивную функцию для поиска всех детей для экземпляра класса, но это было бы меньше идеала. Все советы будут оценены, спасибо.

ответ

0

Вам не нужно писать код, чтобы идти на дерево объектов самостоятельно - есть несколько там уже (jdereg-х java-util, например), а JAXBIntrospector найти объекты аннотированные с XmlRootElement для вас. Было бы немного больше работы, если вы ищете другие аннотации, но не так много.

Например:

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 + '\'' + '}'; 
     } 
    } 
} 
Смежные вопросы