我正在尝试使用最新的JDOM包生成XML文档。我遇到了根元素和命名空间的问题。我需要生成这个根元素:
<ManageBuildingsRequest
xmlns="http://www.energystar.gov/manageBldgs/req"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.energystar.gov/manageBldgs/req
http://estar8.energystar.gov/ESES/ABS20/Schemas/ManageBuildingsRequest.xsd">
我使用此代码:
Element root = new Element("ManageBuildingsRequest");
root.setNamespace(Namespace.getNamespace("http://www.energystar.gov/manageBldgs/req"));
Namespace XSI = Namespace.getNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
root.addNamespaceDeclaration(XSI);
root.setAttribute("schemaLocation", "http://www.energystar.gov/manageBldgs/req http://estar8.energystar.gov/ESES/ABS20/Schemas/ManageBuildingsRequest.xsd", XSI);
Element customer = new Element("customer");
root.addContent(customer);
doc.addContent(root); // doc jdom Document
但是,ManageBuildingsRequest之后的下一个元素也具有默认命名空间,这会破坏验证:
<customer xmlns="">
有任何帮助吗?谢谢你的时间。
答案 0 :(得分:16)
您用于customer
元素的constructor创建它没有命名空间。您应该使用Namespace
作为参数的构造函数。您还可以为根元素和客户元素重用相同的Namespace
对象。
Namespace namespace = Namespace.getNamespace("http://www.energystar.gov/manageBldgs/req");
Element root = new Element("ManageBuildingsRequest", namespace);
Namespace XSI = Namespace.getNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
root.addNamespaceDeclaration(XSI);
root.setAttribute("schemaLocation", "http://www.energystar.gov/manageBldgs/req http://estar8.energystar.gov/ESES/ABS20/Schemas/ManageBuildingsRequest.xsd", XSI);
Element customer = new Element("customer", namespace);
root.addContent(customer);
doc.addContent(root); // doc jdom Document
答案 1 :(得分:1)
这是一种实现自定义XMLOutputProcessor的替代方法,该方法跳过发出空名称空间声明:
public class CustomXMLOutputProcessor extends AbstractXMLOutputProcessor {
protected void printNamespace(Writer out, FormatStack fstack, Namespace ns)
throws java.io.IOException {
System.out.println("namespace is " + ns);
if (ns == Namespace.NO_NAMESPACE) {
System.out.println("refusing to print empty namespace");
return;
} else {
super.printNamespace(out, fstack, ns);
}
}
}
答案 2 :(得分:0)
我尝试了javanna的代码但不幸的是它继续在文档的内容中生成空命名空间。在尝试了bearontheroof的代码后,XML导出就好了。
创建自定义类后,您必须执行以下操作:
CustomXMLOutputProcessor output = new CustomXMLOutputProcessor();
output.process(new FileWriter("/path/to/folder/generatedXML.xml"), Format.getPrettyFormat(), document);