JDOM中的命名空间(默认)

时间:2011-12-02 16:08:03

标签: java xml jdom

我正在尝试使用最新的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="">

有任何帮助吗?谢谢你的时间。

3 个答案:

答案 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);