当元素位于命名空间中时,无法对Java Map进行解组

时间:2013-01-25 22:12:36

标签: jaxb xml-namespaces

我正在尝试使用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注释分组列表元素的直接子元素。但是地图有这些隐含的子结构/子元素。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

JAXB (JSR-222)实现将java.util.Map视为一种域对象(如CustomerAddress等)而不是集合类(如java.util.List) 。这意味着它只为它创建一个映射。因此,它不会从域模型继承命名空间限定,也不符合命名空间限定。如果您创建模型的实例并整理出来,您将会了解这意味着什么。

如果您希望Map的XML表示符合格,那么您可以使用XmlAdapter来执行此操作。