1

我正在尝试使用 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 映射最终没有元素之外,应用程序中的所有内容都可以正常工作。

还值得一提的是,在我添加命名空间之前,这一切都很好。

我猜这个问题与entrykeyvalue标签有关。这些不是我选择的标签名称。这些是 JAXB 在解组到 Java Map 时似乎假定的标记名称。在引入命名空间之前,我通过检查编组输出发现了它们。

所以我最好的猜测是这不起作用的原因是因为这些标签在实例文件的命名空间中,但是我在 @XmlElementWrapper 注释中提供的命名空间没有被那些隐含的标签继承。

如果这是其他集合(如列表),您可以使用 @XmlElement 注释分组列表元素的直接子元素。但是地图有这些隐含的子结构/子元素。

我该如何解决?

4

1 回答 1

1

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

如果您希望 的 XML 表示Map符合命名空间,那么您可以利用 anXmlAdapter来执行此操作。

于 2013-01-28T19:21:15.830 回答