Пространства имен (по умолчанию) в JDOM - PullRequest
6 голосов
/ 02 декабря 2011

Я пытаюсь создать документ XML с использованием новейшего пакета JDOM. У меня проблемы с корневым элементом и пространством имен. Мне нужно произвести этот корневой элемент:

<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 ]

16 голосов
/ 02 декабря 2011

Конструктор , который вы используете для элемента customer, создает его без пространства имен.Вы должны использовать конструктор с 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 голос
/ 13 апреля 2012

Вот альтернативный подход, который реализует пользовательский 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);
        }
    }
}
0 голосов
/ 30 октября 2014

Я попробовал код javanna, но, к сожалению, он продолжал генерировать пустые пространства имен в содержимом документа.После того, как вы попробовали код bearontheroof, XML экспортировался просто отлично.

Вы должны сделать что-то подобное после создания пользовательского класса:

CustomXMLOutputProcessor output = new CustomXMLOutputProcessor();
output.process(new FileWriter("/path/to/folder/generatedXML.xml"), Format.getPrettyFormat(), document);
...