Java 在对象解组后,是否可以使用jaxb注释来导航对象?
我有一个相当复杂的XML模式,我使用hyperjaxb3生成带有注释的pojo。有时,我有父对象,希望检查子对象的值,该值可能是8或9个子对象深。是否可以使用jaxb或其他工具根据jaxb注释获取特定类的子对象列表Java 在对象解组后,是否可以使用jaxb注释来导航对象?,java,jaxb,jaxb2,hyperjaxb,Java,Jaxb,Jaxb2,Hyperjaxb,我有一个相当复杂的XML模式,我使用hyperjaxb3生成带有注释的pojo。有时,我有父对象,希望检查子对象的值,该值可能是8或9个子对象深。是否可以使用jaxb或其他工具根据jaxb注释获取特定类的子对象列表 我可以编写一个递归函数来搜索所有子类的一个类实例,但这并不理想。任何建议都将不胜感激。您不必自己编写代码来遍历对象树-已经有一些(例如jdereg),而JAXBIntrospector将为您找到带有XmlRootElement注释的对象。如果您正在寻找其他注释,则需要做更多的工作,但
我可以编写一个递归函数来搜索所有子类的一个类实例,但这并不理想。任何建议都将不胜感激。您不必自己编写代码来遍历对象树-已经有一些(例如jdereg),而
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 + '\'' + '}';
}
}
}
publicstaticvoidmain(字符串[]args)抛出jaxbeexception{
JAXBContext jc=JAXBContext.newInstance(Foo.class);
JAXBIntrospector is=jc.createJAXBIntrospector();
//找到的对象
列表栏=新的ArrayList();
//要查找的对象名称
QName barName=新的QName(“,”条”);
//要进行内省的未编组根对象
Foo target=newfoo(newfoo.Bar());
//在对象图中漫游,查找“条形”元素
Traverser.traverse(目标,o->{
if(barName.equals(is.getElementName(o))){
add((Foo.Bar)JAXBIntrospector.getValue(o));
}
});
系统输出打印项次(条);
}
//
//一些测试对象
//
@XmlRootElement(name=“foo”)
公开课Foo{
私人酒吧;
公共Foo(){}
公共餐厅(酒吧){
这个.bar=bar;
}
@xmlement(name=“bar”)
公共酒吧{
返回杆;
}
公共空间立根杆(杆){
这个.bar=bar;
}
@XmlRootElement(name=“bar”)
公共静态类栏{
String name=“凯特”;
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
@凌驾
公共字符串toString(){
返回“Bar{name=”+name+'\''+'}”;
}
}
}