当前位置: 首页 > 面试题库 >

嵌套元素列表的JAXB批注

毛峻
2023-03-14
问题内容

我有以下XML:

<mappings>
    <mapping>
        <parameter attr = "value">asdas</parameter>
        <parameter attr = "value2">d123asdsad</parameter>
        <parameter attr = "value3">0</parameter>
    </mapping>
    <mapping>
        <parameter attr = "value">23123s</parameter>
        <parameter attr = "value2">qwerty</parameter>
        <!-- more parameter elements -->
    </mapping>
    <!-- more mapping elements -->
</mappings>

我有以下Java类将其映射到:

@XmlRootElement(name = "mappings")
public class Mappings { 
    @XmlElement(name = "mapping")
    private List<Mapping> mMappings;

    public List<Mapping> getMappings() {
        return mMappings;
    }

    public void setMappings(List<Mapping> aMappings) {
        this.mMappings = aMappings;
    }
}

public class Mapping {
    @XmlElement(name = "parameter")
    private List<Parameter> mParameters;

    public List<Parameter> getParameters() {
        return mParameters;
    }

    public void setParameters(List<Parameter> aParameters) {
        this.mParameters = aParameters;
    }
}

public class Parameter {
    @XmlAttribute(name = "attr")
    private String mName;

    @XmlValue
    private String mValue;

    public String getName() {
        return mName;
    }

    public void setName(String aName) {
        this.mName = aName;
    }

    public String getValue() {
        return mValue;
    }

    public void setValue(String aValue) {
        this.mValue = aValue;
    }
}

当我尝试与解组

JAXBContext context = JAXBContext.newInstance(BundleMappings.class);
Unmarshaller um = context.createUnmarshaller();
mappings = (BundleMappings)um.unmarshal(new File(myFile));

我得到这个错误

If a class has @XmlElement property, it cannot have @XmlValue property.

我需要参数同时具有’attr’属性和内容,所以我在做什么错呢?


问题答案:

默认情况下, JAXB(JSR-222)
实现将公共属性(获取/设置方法)和带注释的字段视为已映射(和分开)。默认映射是@XmlElement这样,因此您的属性将被视为以此方式映射。

解决方案1

由于您要注释字段,因此需要@XmlAccessorType(XmlAccessType.FIELD)在类中添加。

@XmlAccessorType(XmlAccessType.FIELD)
public class Parameter {
    @XmlAttribute(name = "attr")
    private String mName;

    @XmlValue
    private String mValue;

    public String getName() {
        return mName;
    }

    public void setName(String aName) {
        this.mName = aName;
    }

    public String getValue() {
        return mValue;
    }

    public void setValue(String aValue) {
        this.mValue = aValue;
    }
}

解决方案#2

注释get(或set)方法

public class Parameter {
    private String mName;

     private String mValue;

    @XmlAttribute(name = "attr")
    public String getName() {
        return mName;
    }

    public void setName(String aName) {
        this.mName = aName;
    }

    @XmlValue
    public String getValue() {
        return mValue;
    }

    public void setValue(String aValue) {
        this.mValue = aValue;
    }
}

想要查询更多的信息

  • http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html
  • http://blog.bdoughan.com/2011/06/jaxb-and-complex-types-with-simple.html

更新

您还需要@XmlElementmappings属性上使用注释,以指定元素名称应为mapping

@XmlRootElement(name = "mappings")
public class Mappings { 
    private List<Mapping> mMappings;

    @XmlElement(name="mapping")
    public List<Mapping> getMappings() {
        return mMappings;
    }

    public void setMappings(List<Mapping> aMappings) {
        this.mMappings = aMappings;
    }
}


 类似资料:
  • 问题内容: 我试图找出所有可以嵌套在段落元素中的有效HTML5元素,以使w3验证程序不会显示任何错误。我的意思是我正在尝试找出所有可以替换以下代码中的点的标记,以便w3验证程序不显示任何错误: 有这样的清单吗?我尝试在Google上搜索时没有任何运气。 即使有相反的列表,即不能嵌套在段落元素中的元素,对我来说也足够了。 问题答案: HTML5规范告诉我们,元素的内容模型正在对content进行措辞

  • 我目前正在学习如何在android中使用Jaxb解析xml文件。但是我不知道代码中有什么错误,以及在哪里和如何纠正它。我无法解析xml并获得食品列表。如果我删除List并简单地把它写成Food,那么只有xml中的最后一个元素被解析,其余的似乎都被覆盖了。请帮助我。 我试图解析http://www.w3schools.com/xml/simple.xml,,目前我有这样的代码: ---- 用于取消

  • 如何使用JAXB生成以下结构?在我的例子中,我有一个动态属性列表,它可能有3种类型:整数、字符串或列表。但是,列表属性具有嵌套元素。我怎样才能做到这一点?

  • 假设我有一个这样的列表: 我想要一个只包含嵌套列表的第一个元素的列表。我可以通过这样返回另一个列表来做到这一点 这个有捷径符号吗?

  • 问题内容: 好的,现在我这里有一个无序列表: 基本上,我只想将此数据转换为JSON实体。我想在 Jquery中 完成此操作,而且我觉得我很难过。上面的列表只是一个例子,实际上,我的列表理想情况下将有更多的孩子,并且深度可能是n级(意思是,它将有孙子孙的孙子……或更多)我失去了无数数小时的睡眠,我不认为我会去任何地方:( 我想提取这些东西:锚点内的文本,锚点的url和锚点的标题,并将它们放到JSON

  • 你知道这是怎么回事吗?