请注意,这不是我提出的另一个问题的重复,“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
为空。就好像第一个映射使用元素一样,因此无法读取基于该元素或其属性的更多值。
答案 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