首页 > 解决方案 > 基于给定 XSD 文件将 Java 对象转换为 XML 的问题

问题描述

我正在 DSpace 5.2 中生成自定义 XML 导出。要导出为 XML 文件的项目具有元数据值数组。这些值必须出现在 XML 文件中,因为给定的 XSD 文件定义了它们的层次结构。我将基于 XSD 顺序的值添加到 XML 中,但某些 XML 标记的顺序与插入顺序不同。

更多细节

我使用的方法是,首先,将元数据值数组移动到地图中。映射的键是元数据字段名称。然后,基于 XSD,我从地图中获取适当的值并生成如下 XML 元素:

import org.dspace.content.Metadatum;
import org.w3c.dom.Element;
import org.w3c.dom.Document;

public class DSpaceXML implements Serializable {
// A member variable
private Document doc;

// A DSpace built-in function used to export an item to an XML
    public final void addItem(Item item) throws Exception {

        // Initialize this.doc
        Element rootElement = doc.createElement("root");
        Element higherElement = doc.createElement("higher-element");
        Element lowerElement = doc.createElement("lower-element");

        insertMetadataAsChildOfElement(higherElement, "child-of-higher", "dc.childOfHigher");
        rootElement.appendChild(higherElement);

        insertMetadataAsChildOfElement(lowerElement, "child-of-lower", "dc.childOfLower");
        rootElement.appendChild(lowerElement);

        // stuff to generate other elements of the XML
    }

    private void insertMetadataAsChildOfElement(Element parentElement, String childElementName,
            String key) {

        Element childElement;

        <Metadatum> metadatumList = (<Metadatum>) metadataMap.get(key);

        childElement = createElement(childElementName, metadatum.value);

        parentElement.appendChild(childElement);
    }

    private Element createElement(String name, String value) {
        Element el = doc.createElement(name);
        el.appendChild(doc.createTextNode(value));
        return el;
    }
}

我期望这样的 XML:

<root>
     <higher-element>
         <child-of-higher>Value1</child-of-higher>
     </higher-element>
     <lower-element>
         <child-of-lower>Value2</child-of-lower>
     </lower-element>
     <another-element-1/>
     ....
     <another-element-n/>
</root>

我得到的是这样的(<lower-element>之前<higher-element>):

<root>
     <lower-element>
         <child-of-lower>Value2</child-of-lower>
     </lower-element>
     <another-element-1/>
     ....
     <another-element-k/>
     <higher-element>
         <child-of-higher>Value1</child-of-higher>
     </higher-element>
     <another-element-k-plus-1/>
     ....
     <another-element-n/>
</root>

我无法弄清楚为什么rootElement.appendChild(higherElement)在之前调用时会发生这种情况rootElement.appendChild(lowerElement)。另外,如果有人让我知道我的方法是否是从 XSD 生成 XML 的最佳方法,我将不胜感激。

标签: javaxmlxsddspace

解决方案


我发现我的代码中有一个错误。由于检查了很多元数据值,行后很多行rootElement.appendChild(lowerElement),我有一行rootElement.appendChild(higherElement),所以它覆盖了以前的 XML 元素层次结构。结果<higher-element>出现了之后<lower-element>。但是关于我的问题的第二部分,如果有人能告诉我关于 DSpace 5 限制的基于 XSD 生成 XML 的最佳实践,我会很高兴。


推荐阅读