【问题标题】:How to skip a field and only unmarshal a specific member of that field using JAXB?如何跳过一个字段并仅使用 JAXB 解组该字段的特定成员?
【发布时间】:2018-03-04 13:57:24
【问题描述】:

我需要解组已为其创建模型的 XML 文件。在 XML 文件中,我有一个元素名称,在我的模型中它是 Person 类型字段的成员。 我想要做的是将“name”元素解组到 person.name 中,但问题是在 XML 文件中没有 Person 节点,它正确地转到“name”。是否可以通过 JAXB 实现这一点?

这是 XML 文件的简化版本:

<root>
    <id>1</id>
    <name>Jack</name>
</root>

这些是我试图将 XML 解组为的模型:

@XmlRootElement (name = "root")
public class Container{
    @XmlElement
    int id;

    //how should I annotate this?
    Person person;
}
public class Person{
    int age;

    //and how should I annotate this one?
    String name;
}

我期望发生的事情: 我有一个容器 container.person.name.equals("Jack") &amp;&amp; container.id == 1

我尝试在personPerson.name 中设置XmlElement(尝试了所有组合)但无济于事。

使用这种方法(不包括 XML 中的人员)的要点是,我的真实代码中的这个“名称”是一个表达式,我需要处理它并将值分配给人员的不同字段。

【问题讨论】:

    标签: java xml-parsing jaxb unmarshalling


    【解决方案1】:

    要进行此特定映射,请添加 name getter 并使用 @XmlElement 对其进行注释。
    这个想法是使用Container 中定义的name getter 和setter 来允许JAXB 在编组或解组root 元素时依赖Person 字段。

    只允许解组:

    @XmlElement
    public void setName(String name) {
        if (person == null){
           person = new Person();
        }
        person.setName(name);
    }
    

    允许编组和解组:

    @XmlElement
    public String getName() {
         return person.getName();
    }
    
    public void setName(String name) {
        if (person == null){
           person = new Person();
        }
        person.setName(name);
    }
    

    【讨论】:

    • 感谢您的快速回答。尽管这种方式它为模型添加了许多额外的字段和 setter getter,但我认为不会有任何其他更简单的解决方法。我决定将这些字段命名为“dummy_xxx”,只是为了将它们与其他模型字段区分开来。
    • 不客气 :) 通常你不需要添加额外的字段,只需要 setter 和 getter。
    • 你是对的!如果你不介意,再问一个问题。吸气剂的目的是什么?我只使用了一个没有任何 getter 的 setter,并且解组工作得很好。
    • 当然。它工作正常,因为你不编组到 xml。 Setter 用于解组 (xml->java) 和 getter 用于编组 (java->xml)。我添加了两者来处理这两种情况,但如果你不需要编组,可以删除它。我更新以指定案例。
    猜你喜欢
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多