通过@XmlPath MOXy注释解组嵌套集合

时间:2012-06-22 09:29:35

标签: java jaxb eclipselink moxy

给出以下XML结构:

<root>
  <data>x</data>
  <details>
    <some_other_element>...</some_other_element>
    <collection>
      <element><a>1</a></element>
      <element><a>2</a></element>
      <element><a>3</a></element>
    <collection>
  </details>
</root>

如何使用MOXy将其解组为大多数平坦的POJO?我试过这种方法(为了简洁而省略了吸气剂和吸尘剂):

@XmlRootElement(name = "root")
class Root {
  @XmlElement
  private String data;

  @XmlElement
  @XmlPath("details/some_other_element")
  private String someOtherElement;

  @XmlPath("details")
  @XmlElementWrapper(name = "collection")
  @XmlElement(name = "element")
  private Collection<Element> elements;
}

class Element {
  @XmlElement
  private String a;
}

不幸的是,这只会在elements集合中添加一个未初始化的内容。我想避免声明Details类(确实有效),因为这会破坏@XmlPath以下元素的其他<details>映射。

我已经确认MOXy实际已加载(如jaxb.properties中所声明的那样)。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

尝试将包装标记和元素添加到@XmlPath,而不是使用@XmlElementWrapper

@XmlPath("details/collection/element")
@XmlElement(name = "element")
private Collection<Element> elements;

我认为您甚至可以保留@XmlElementWrapper注释以防将来更改jaxb提供程序。


以下是您的用例所需的最小注释:

package forum11153599;

import java.util.Collection;
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement
class Root {
    @XmlElement
    private String data;

    @XmlPath("details/some_other_element/text()")
    private String someOtherElement;

    @XmlPath("details/collection/element")
    private Collection<Element> elements;

}