【问题标题】:Handling <property key='name' value='Foo' /> instead of <name>Foo</name> with JAXB使用 JAXB 处理 <property key='name' value='Foo' /> 而不是 <name>Foo</name>
【发布时间】:2011-07-07 07:13:29
【问题描述】:

我的 XML 看起来像这样:

 <thing>
    <property key='name' value='Foo' />
 </thing>

我想使用 JAXB 阅读。

我知道我能做到

@XmlRootElement(name="thing")
public class Thing{

   @XmlElement(name="name")
   public String name;
}

如果 XML 看起来像

<thing>
   <name>Foo</name>
</thing>

,但是上面的 XML 布局我该怎么办呢?

【问题讨论】:

    标签: java xml jaxb


    【解决方案1】:

    注意:我是 EclipseLink JAXB (MOXy) 负责人,也是 JAXB 2.X (JSR-222) 专家组的成员。

    对于这个用例,您可以使用 MOXy 的 @XmlPath 扩展:

    @XmlRootElement(name="thing")
    public class Thing{
    
       @XmlPath("property[@key='name']/@value")
       public String name;
    }
    

    更多信息:

    【讨论】:

    • 甜蜜。我会试试看。这是包含在下一版本 JAXB 中的路线图吗?
    • 这适用于 MOXy 2.3。 maven一开始给我的是2.2,2.2也有XmlPath,也绑定东西,不过好像忽略了attribute上的条件。多亏了 Blaise 的博文,他宣布这是 2.3 中的一项新功能,我才能够弄清楚这一点。
    【解决方案2】:

    如果我没记错的话,我们需要创建 2 个类,一个用于事物,另一个用于属性,如下所示

        @XmlAccessorType(XmlAccessType.FIELD)
        @XmlType(name = "", propOrder = {"property"})
        @XmlRootElement(name = "thing")
        public class Thing {
    
            @XmlElement(required = true)
            protected Property property;
    
            public Property getProperty() {
                return property;
            }
    
            public void setProperty(Property value) {
                this.property = value;
            }
    
        }
    

    另一个类将是

        @XmlAccessorType(XmlAccessType.FIELD)
        @XmlType(name = "")
        @XmlRootElement(name = "property")
        public class Property {
    
            @XmlAttribute(required = true)
            protected String key;
            @XmlAttribute(required = true)
            protected String value;
    
            public String getKey() {
                return key;
            }
    
            public void setKey(String value) {
                this.key = value;
            }
    
            public String getValue() {
                return value;
            }
    
            public void setValue(String value) {
                this.value = value;
            }
    
        }
    

    【讨论】:

    • 如果这是我使用 JAXB 的唯一选择,我将改用 XPath 来手动编写解组器代码。
    猜你喜欢
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    相关资源
    最近更新 更多