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