Проблема преобразования объектов Java в XML на основе заданного файла XSD - PullRequest
1 голос
/ 01 октября 2019

Я создаю пользовательский экспорт XML в DSpace 5.2. Элемент, который должен быть экспортирован как файл 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>

Что яget выглядит так (<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). Кроме того, я был бы признателен, если бы кто-нибудь дал мне знать, является ли мой подход наилучшим для генерации XML из XSD.

1 Ответ

1 голос
/ 02 октября 2019

Я понял, что в моем коде есть ошибка. Из-за проверки большого количества значений метаданных, много строк после строки rootElement.appendChild(lowerElement), у меня была строка rootElement.appendChild(higherElement), поэтому она вышла за пределы прежней иерархии элементов XML. В результате <higher-element> появилось после <lower-element>. Но что касается второй части моего вопроса, я буду рад, если кто-нибудь расскажет мне о лучших практиках создания XML на основе XSD с учетом ограничений DSpace 5.

...