解组后是否可以使用 jaxb 注释来导航对象?
Is it possible to use jaxb annotations to navigate objects after they are unmarshalled?
我有一个相当复杂的 XML 模式,我使用 hyperjaxb3 生成带有注释的 pojo。有时我有父对象并想检查可能有 8 或 9 个子对象深的子对象的值。有没有办法根据 jaxb 注释使用 jaxb 或其他工具来获取特定 class 的子对象列表?
我可以编写一个递归函数来搜索所有子项以查找 class 的实例,但这并不理想。如有任何建议,我们将不胜感激。
您不必自己编写代码来遍历对象树 — 已经有一些代码(例如 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 + '\'' + '}';
}
}
}
我有一个相当复杂的 XML 模式,我使用 hyperjaxb3 生成带有注释的 pojo。有时我有父对象并想检查可能有 8 或 9 个子对象深的子对象的值。有没有办法根据 jaxb 注释使用 jaxb 或其他工具来获取特定 class 的子对象列表?
我可以编写一个递归函数来搜索所有子项以查找 class 的实例,但这并不理想。如有任何建议,我们将不胜感激。
您不必自己编写代码来遍历对象树 — 已经有一些代码(例如 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 + '\'' + '}';
}
}
}