0

我有一个相当复杂的 XML 模式,我使用 hyperjaxb3 生成带有注释的 pojo。有时我有父对象并想检查可能是 8 或 9 个子对象深的子对象的值。无论如何使用 jaxb 或其他工具来获取基于 jaxb 注释的特定类的子对象列表?

我可以编写一个递归函数来搜索所有子类的实例,但这并不理想。任何建议将不胜感激,谢谢。

4

1 回答 1

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 + '\'' + '}';
        }
    }
}
于 2017-01-20T01:59:04.517 回答