Установить пространство имен с помощью jdom

Я хотел бы иметь этот формат в xml:

<ns2: test xmlns="url" xmlns:ns2="url2" xmlns:ns3="url3">
....
</ns2: test>

Я использую следующий код:

    Namespace ns= Namespace.getNamespace("url");
    Namespace ns2 = Namespace.getNamespace("ns2", "url2");
    Namespace ns3= Namespace.getNamespace("ns3", "url3");

    SAXBuilder vDocBuilder = new SAXBuilder();
    Document vDocument = vDocBuilder.build(File);

    System.out.println("Root element " + vDocument.getRootElement().getName());

    org.jdom.Element test = new org.jdom.Element("test", ns);
    vDocument.setRootElement(test);
    vNewRootElement.addNamespaceDeclaration(ns2);
    vNewRootElement.addNamespaceDeclaration(ns3);

Если я установлю пространство имен с помощью:

    vNewRootElement.setNamespace(ns3);

Тогда я получаю это: с

    <ns2: test xmlns:ns2="url2" xmlns:ns3="url3"> ... </ns2: test> 
without the default namespace xmlns="url".

Может ли кто-нибудь сказать мне, почему это не работает, и есть ли способ решить эту проблему?

Спасибо, ханер


person haner    schedule 16.08.2011    source источник
comment
Вы объявили пространство имен без префикса - это то, что делает xmlns="url".   -  person skaffman    schedule 17.08.2011


Ответы (2)


Следующие выходы (в System.out)

<?xml version="1.0" encoding="UTF-8"?>
<ns2:test xmlns:ns2="url2" xmlns="url" xmlns:ns3="url3">Some text</ns2:test>

import java.io.IOException;
import org.jdom.Document;
import org.jdom.JDOMException;
import org.jdom.Namespace;
import org.jdom.output.XMLOutputter;

public class Test {

    public static void main(String args[]) throws JDOMException, IOException {
        Namespace ns = Namespace.getNamespace("url");
        Namespace ns2 = Namespace.getNamespace("ns2", "url2");
        Namespace ns3 = Namespace.getNamespace("ns3", "url3");


        Document vDocument = new Document();
        org.jdom.Element test = new org.jdom.Element("test", ns2);
        vDocument.setRootElement(test);
        //add "url" default namespace
        test.addNamespaceDeclaration(ns);
        test.addNamespaceDeclaration(ns2);
        test.addNamespaceDeclaration(ns3);
        test.addContent("Some text");
        //dump output to System.out
        XMLOutputter xo = new XMLOutputter();
        xo.output(vDocument, System.out);

    }
}

вам нужна линия

   test.addNamespaceDeclaration(ns);
person reevesy    schedule 17.08.2011

Добавьте пространство имен следующим образом:

val root = new Element("test", "url")

это выведет:

<test xmlns="url">

если вы хотите, чтобы дочерние элементы также использовали одно и то же пространство имен, сделайте это при добавлении элемента:

val msgHeader = new Element("body", test.getNamespace)

в противном случае дочерний элемент по умолчанию будет иметь xmlns=.

Пример кода на Scala:

import org.jdom.output.{Format, XMLOutputter}
import org.jdom.{Document, Element, Namespace}

val doc = new Document()

//Root Element
val root = new Element("test", "url")
val ns2 = Namespace.getNamespace("ns2", "url2")

root.addNamespaceDeclaration(ns2)
root.setAttribute("attribute1", "value1")

val xmlHeader = new Element("MessageHeader", root.getNamespace)
val xmlBody = new Element("MessageBody", root.getNamespace)

root.addContent(xmlHeader)
root.addContent(msgBody)

doc.setRootElement(root)

это выведет:

<test xmlns="url" xmlns:ns2="url2" attribute1="value1">
  <MessageHeader>  </MessageHeader>
  <StatusMessageBody> </StatusMessageBody>
</test>
person oneDerer    schedule 22.06.2020