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

时间:2013-10-05 06:02:09

标签: java xml jaxb xml-binding

我从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)填充它,但我没有看到任何方法这样做。任何帮助或建议将不胜感激。

1 个答案:

答案 0 :(得分:2)

注意:我是EclipseLink JAXB (MOXy)主管,是JAXB (JSR-222)专家组的成员。

对于此用例,您可以使用我们在EclipseLink 2.5.1中添加到MOXy的@XmlVariableNode

Java模型

<强>实体

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

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);
    }

}

<强> input.xml中/输出

这是您提问的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>

更多信息