如何在XmlElement列表中获取XmlElement的名称

4

我将从一个REST服务获取XML,它看起来像:

<entity>
  <foo>
    <count>1</count>
    <date>1970-01-01</date>
    <margin>78.67</margin>
  </foo>
  <bar>
    <count>2</count>
    <date>1450-09-17</date>
    <margin>24.56</margin>
  </bar>
  <baz>
    <count>11</count>
    <date>1968-11-12</date>
    <margin>98.76</margin>
  </baz>
</entity>

我正在使用一个名为 Entity.java 的类进行解析,它具有以下特点:

@XmlRootElement(name = "entity")
@XmlAccessorType(XmlAccessType.FIELD)
public class Entity implements Serializable {

  @XmlElements({
        @XmlElement(name="foo"),
        @XmlElement(name="bar"),
        @XmlElement(name="baz")
  })
  private List<EntityElement> entityElements;
....

如果有一个EntityElement类如下:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class EntityElement implements Serializable {
    @XmlElement(required = true)
    private int count

    @XmlElement(required = true)
    private String date;

    @XmlElement(required = false)
    private long margin;
....

这一切都按我的期望工作,我得到了一个EntityElements列表。我想添加一个名字字段,并将其填充为找到的元素的名称(foo、bar或baz),但我没有看到任何方法来实现这一点。任何帮助或建议将不胜感激。


为什么不在实体中简单地设置3个字段foo、bar和baz呢?这样,您就可以知道哪个是null,哪个不是。 - JB Nizet
这应该会有所帮助:http://blog.bdoughan.com/2012/08/removing-jaxbelement-from-your-domain.html - bdoughan
1个回答

2

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

您可以使用在EclipseLink 2.5.1中添加的MOXy的@XmlVariableNode来完成此用例。

Java模型

实体

我们将在entityElements字段上使用MOXy的@XmlVariableNode。在该字段上,我们指定目标类上表示元素名称的字段。

import java.io.Serializable;
import java.util.List;
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlVariableNode;

@XmlRootElement(name = "entity")
@XmlAccessorType(XmlAccessType.FIELD)
public class Entity implements Serializable {

    @XmlVariableNode("name")
    private List<EntityElement> entityElements;

}

EntityElement(实体元素)

我们将使用 @XmlTransient 注释来防止 name 字段的值作为子元素进行编组。

import java.io.Serializable;
import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class EntityElement implements Serializable {

    @XmlTransient
    private String name;

    @XmlElement(required = true)
    private int count;

    @XmlElement(required = true)
    private String date;

    @XmlElement(required = false)
    private long margin;

}

jaxb.properties

要将MOXy指定为您的JAXB提供程序,您需要在与域模型相同的包中包含一个名为jaxb.properties的文件,并具有以下条目(请参见:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html)。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

演示代码

演示

由于MOXy是JAXB (JSR-222)的实现,因此仅需要标准的运行时API。

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Entity.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum19194567/input.xml");
        Entity entity = (Entity) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(entity, System.out);
    }

}

输入/输出

这是你问题中的XML文档。

<?xml version="1.0" encoding="UTF-8"?>
<entity>
   <foo>
      <count>1</count>
      <date>1970-01-01</date>
      <margin>0</margin>
   </foo>
   <bar>
      <count>2</count>
      <date>1450-09-17</date>
      <margin>0</margin>
   </bar>
   <baz>
      <count>11</count>
      <date>1968-11-12</date>
      <margin>0</margin>
   </baz>
</entity>

了解更多信息


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接