我正在尝试使用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映射最终没有元素之外,应用程序中的所有内容在unmarhsaling方面都运行良好。
值得一提的是,在我添加名称空间之前,这一切都运行良好。
我猜这个问题与条目,密钥和值标记有关。这些不是我选择的标签名称。这些是JAXB在解析Java Map时似乎假设的标记名称。我在引入名称空间之前通过检查封送输出来发现它们。
所以我最好的猜测是因为thosse标签位于实例文件的名称空间中,因此不起作用,但我在@XmlElementWrapper注释中提供的命名空间不会被这些隐含标签继承。
如果这是其他一些Collection(如列表),则可以使用@XmlElement注释分组列表元素的直接子元素。但是地图有这些隐含的子结构/子元素。
我该如何解决这个问题?
答案 0 :(得分:1)
JAXB (JSR-222)实现将java.util.Map
视为一种域对象(如Customer
,Address
等)而不是集合类(如java.util.List
) 。这意味着它只为它创建一个映射。因此,它不会从域模型继承命名空间限定,也不符合命名空间限定。如果您创建模型的实例并整理出来,您将会了解这意味着什么。
如果您希望Map
的XML表示符合格,那么您可以使用XmlAdapter
来执行此操作。