根据给定的 XSD 文件将 Java 对象转换为 XML 时出现问题

Problem in converting Java objects to XML based on a given XSD file

我正在 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(lowerElement) 之前调用 rootElement.appendChild(higherElement) 时会发生这种情况。另外,如果有人让我知道我的方法是否是从 XSD.

生成 XML 的最佳方法,我将不胜感激。

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