我正在尝试使用 JAXB 将一些 XML 解组为 Java Map。
我相信我正在使用 Sun/Oracle 提供的 JAXB 参考实现(com.sun.xml.internal.bind ...
这是来自实例文件的相关 XML 的(缩写)部分:
<Report
xmlns="http://www.escholar.com/eReports"
path="Books" reportName="BooksRead" eTag="eTag value">
<SelectList>
<entry>
<key>DOC</key>
<value>Microsoft Word (DOC)</value>
</entry>
<entry>
<key>PDF</key>
<value>Adobe Portable Document Format (PDF)</value>
</entry>
</Selectlist>
.
.
.
</Report>
如您所见,所有元素都在一个命名空间中。
这是 selectList 的带注释的 Java 字段:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "InputSelectionType", namespace=ReportJAXB.NAMESPACE, propOrder = {
"selectList"
})
public class InputSelectionTypeJAXB extends InputParameterTypeJAXB
implements InputSelectionType
{
@XmlElementWrapper(name="SelectList", namespace=ReportJAXB.NAMESPACE)
protected LinkedHashMap<String, String> selectList;
这是 ReportJAXB.NAMESPACE 的定义(与实例文件 @xmlns 中的相同):
protected final static String NAMESPACE = "http://www.escholar.com/eReports";
除了 selectList 映射最终没有元素之外,应用程序中的所有内容都可以正常工作。
还值得一提的是,在我添加命名空间之前,这一切都很好。
我猜这个问题与entry、key和value标签有关。这些不是我选择的标签名称。这些是 JAXB 在解组到 Java Map 时似乎假定的标记名称。在引入命名空间之前,我通过检查编组输出发现了它们。
所以我最好的猜测是这不起作用的原因是因为这些标签在实例文件的命名空间中,但是我在 @XmlElementWrapper 注释中提供的命名空间没有被那些隐含的标签继承。
如果这是其他集合(如列表),您可以使用 @XmlElement 注释分组列表元素的直接子元素。但是地图有这些隐含的子结构/子元素。
我该如何解决?