Java 以最简单的方式访问内部元素的属性

Java 以最简单的方式访问内部元素的属性,java,jakarta-ee,jaxb,Java,Jakarta Ee,Jaxb,对于这样简单的xml,有没有办法使用单个java bean进行映射: <item lang="en"> <item-url>some url</item-url> <parent id="id_123"/> </item> 换句话说,在不创建相应bean的情况下,如何访问内部元素的属性?由于我不想在包中创建冗余类,我找到的最佳解决方案是: @XmlRootElement( name = "item" ) public cl

对于这样简单的xml,有没有办法使用单个java bean进行映射:

<item lang="en">
   <item-url>some url</item-url>
   <parent id="id_123"/>
</item>

换句话说,在不创建相应bean的情况下,如何访问内部元素的属性?

由于我不想在包中创建冗余类,我找到的最佳解决方案是:

@XmlRootElement( name = "item" )
public class Item {

    @XmlRootElement( name = "parent" )
    private static class ParentIdWrapper {
        @XmlAttribute( name = "id" )
        public String id;
    }

    @XmlElement( name = "item-url" )
    private String url;

    @XmlElement( name = "parent" )
    private ParentIdWrapper parentIdWrap;

    public String getParentId() {
        return this.parentIdWrap.id;
    }
}

由于我不想在包中创建冗余类,因此我找到的最佳解决方案是:

@XmlRootElement( name = "item" )
public class Item {

    @XmlRootElement( name = "parent" )
    private static class ParentIdWrapper {
        @XmlAttribute( name = "id" )
        public String id;
    }

    @XmlElement( name = "item-url" )
    private String url;

    @XmlElement( name = "parent" )
    private ParentIdWrapper parentIdWrap;

    public String getParentId() {
        return this.parentIdWrap.id;
    }
}

您可以使用
XmlAdapter

ParentIdAdapter

public class ParentIdAdapter extends XmlAdapter<ParentIdAdapter.AdaptedParentId, String> {

    public String unmarshal(AdaptedParentId value) {
        return value.id;
    }

    public AdaptedParentId marshal(String value) {
        AdaptedParentId adapted = new AdaptedParentId();
        adapted.id = value;
        return adapted;
    }

    public static class AdaptedParentId {
        @XmlAttribute
        public String id;
    }

}

如果您使用的是JAXB提供程序,那么您可以利用
@XmlPath
扩展来执行以下操作:

@XmlRootElement( name = "item" )
public class Item {

    @XmlElement( name = "item-url" )
    private String url;

    @XmlPath("parent/@id")
    private String parentId;
}

您可以使用
XmlAdapter

ParentIdAdapter

public class ParentIdAdapter extends XmlAdapter<ParentIdAdapter.AdaptedParentId, String> {

    public String unmarshal(AdaptedParentId value) {
        return value.id;
    }

    public AdaptedParentId marshal(String value) {
        AdaptedParentId adapted = new AdaptedParentId();
        adapted.id = value;
        return adapted;
    }

    public static class AdaptedParentId {
        @XmlAttribute
        public String id;
    }

}

如果您使用的是JAXB提供程序,那么您可以利用
@XmlPath
扩展来执行以下操作:

@XmlRootElement( name = "item" )
public class Item {

    @XmlElement( name = "item-url" )
    private String url;

    @XmlPath("parent/@id")
    private String parentId;
}

看看这条回答你问题的线索:@Alex,谢谢。很遗憾,但我没有使用
MOXy-JAXB实现
。我没有那个注释。我只能使用包
javax.xml.bind.annotation.*
中的注释,所以我不知道简短的答案。如链接SO问题中所述,您必须实现一个XmlAdapter。因此,您可能会发现添加一个带有
id
attribute.FYI的
Parent
对象更容易——因为您的问题是用Java EE标记的,如果您使用的是WebLogic 12.1.1(MOXy是默认的JAXB提供程序)或GlassFish 3.1.2(MOXy作为JAXB提供程序提供),那么您就有了MOXy JAXB实现。我是莫西的领队。我还添加了一个答案,演示了如何使用任何JAXB提供商处理这个用例:@Blaise Doughan,非常感谢!(目前我正在使用嵌入式jetty和默认jaxb实现)看看这个线程,它回答了您的问题:@Alex,谢谢。很遗憾,但我没有使用
MOXy-JAXB实现
。我没有那个注释。我只能使用包
javax.xml.bind.annotation.*
中的注释,所以我不知道简短的答案。如链接SO问题中所述,您必须实现一个XmlAdapter。因此,您可能会发现添加一个带有
id
attribute.FYI的
Parent
对象更容易——因为您的问题是用Java EE标记的,如果您使用的是WebLogic 12.1.1(MOXy是默认的JAXB提供程序)或GlassFish 3.1.2(MOXy作为JAXB提供程序提供),那么您就有了MOXy JAXB实现。我是莫西的领队。我还添加了一个答案,演示了如何使用任何JAXB提供商处理这个用例:@Blaise Doughan,非常感谢!(目前我正在使用嵌入式jetty和默认jaxb实现)。