Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在对象解组后,是否可以使用jaxb注释来导航对象?_Java_Jaxb_Jaxb2_Hyperjaxb - Fatal编程技术网

Java 在对象解组后,是否可以使用jaxb注释来导航对象?

Java 在对象解组后,是否可以使用jaxb注释来导航对象?,java,jaxb,jaxb2,hyperjaxb,Java,Jaxb,Jaxb2,Hyperjaxb,我有一个相当复杂的XML模式,我使用hyperjaxb3生成带有注释的pojo。有时,我有父对象,希望检查子对象的值,该值可能是8或9个子对象深。是否可以使用jaxb或其他工具根据jaxb注释获取特定类的子对象列表 我可以编写一个递归函数来搜索所有子类的一个类实例,但这并不理想。任何建议都将不胜感激。您不必自己编写代码来遍历对象树-已经有一些(例如jdereg),而JAXBIntrospector将为您找到带有XmlRootElement注释的对象。如果您正在寻找其他注释,则需要做更多的工作,但

我有一个相当复杂的XML模式,我使用hyperjaxb3生成带有注释的pojo。有时,我有父对象,希望检查子对象的值,该值可能是8或9个子对象深。是否可以使用jaxb或其他工具根据jaxb注释获取特定类的子对象列表


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

您不必自己编写代码来遍历对象树-已经有一些(例如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+'\''+'}”;
}
}
}