3

请注意,这不是我提出的另一个问题的重复,“使用 MOXy 和 XPath,是否可以解组属性列表? ”它很相似,但不一样。

我的 XML 看起来像这样:

<test>
  <items>
    <item type="cookie" brand="oreo">cookie</item>
    <item type="crackers" brand="ritz">crackers</item>
  </items>
</test>

这类似于我之前的问题中的 xml,除了现在每个项目有两个属性而不是一个。

在我的课堂上:

@XmlPath("items/item/@type")
@XmlAttribute
private ArrayList<String> itemList = new ArrayList<String>();
@XmlPath("items/item/@brand")
@XmlAttribute
private ArrayList<String> brandList = new ArrayList<String>();

感谢我之前的问题的答案,我能够将type属性解组到列表中。 brandList,但是,是空的。如果我注释掉注释itemList(所以它不是由 JAXB/MOXy 填充)然后brandList包含正确的值。

看来我只能使用 XPath 将单个属性解组到列表中。这是设计使然还是我配置错误?

更新:似乎我也无法从元素中解组文本和属性。如果我的班级是这样映射的:

@XmlPath("items/item/text()")
@XmlElement
private ArrayList<String> itemList = new ArrayList<String>();
@XmlPath("items/item/@brand")
@XmlAttribute
private ArrayList<String> brandList = new ArrayList<String>();

brandList在这种情况下也是空的。brandList如果我先切换订单和地图,itemList则为空。就好像第一个映射消耗了元素,因此无法读取基于该元素或其属性的更多值。

4

1 回答 1

2

简答

这不是EclipseLink MOXy中的 @XmlPath 当前支持的用例。我为此输入了以下增强请求,请随时添加其他信息以投票支持此错误:

长答案

MOXy 将支持映射:

@XmlPath("items/item/@type")
private ArrayList<String> itemList = new ArrayList<String>();

到:

<test>
  <items>
    <item type="cookie"/>
    <item type="crackers"/>
  </items>
</test>

但不是:

@XmlPath("items/item/@type")
private ArrayList<String> itemList = new ArrayList<String>();

@XmlPath("items/item/@brand")
private ArrayList<String> brandList = new ArrayList<String>();

到:

<test>
  <items>
    <item type="cookie" brand="oreo"/>
    <item type="crackers" brand="ritz"/>
  </items>
</test>

解决方法

您可以引入一个中间对象 ( Item) 来映射此用例:

@XmlElementWrapper(name="items")
@XmlElement(name="item")
private ArrayList<Item> itemList = new ArrayList<Item>();

 

public class Item {

    @XmlAttribute
    private String type;

    @XmlAttribute
    private String brand;
}

有关更多信息@XmlPath

于 2011-08-19T14:12:47.553 回答