使用MOXy和XPath,是否可以解组两个属性列表?

时间:2011-08-18 01:40:11

标签: java xml jaxb eclipselink moxy

请注意,这不是我提出的另一个问题的重复,“With MOXy and XPath, is it possible to unmarshal a list of attributes?”它是相似的,但不一样。

我的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为空。就好像第一个映射使用元素一样,因此无法读取基于该元素或其属性的更多值。

1 个答案:

答案 0 :(得分:1)

简答

这不是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

的更多信息