给定以下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?我尝试了这种方法(为简洁起见,省略了getter和setter方法):

@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中所声明)。

有任何想法吗?

最佳答案

尝试将包装标签和元素添加到@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;

}

10-07 14:12