2015-02-24 3 views
2

При создании документа с пространством имен по умолчанию <root xmlns="...."> с использованием DOM4J, я получаю следующий вывод при записи в файл.Unwanted Dom4J Пространство имен

<?xml version="1.0" encoding="UTF-8"?> 

<root xmlns="http:/foo.bar"> 
    <foo xmlns="">bar</foo> <!-- unwanted xmlns="" on foo --> 
</root> 

Что я ожидал (и хочу) для Foo быть <foo> не <foo xmlns="">. Вот некоторые демо-код

import org.dom4j.Document; 
import org.dom4j.DocumentHelper; 
import org.dom4j.Element; 
import org.dom4j.Namespace; 
import org.dom4j.io.OutputFormat; 
import org.dom4j.io.XMLWriter; 

public class App { 

    public static void main(String[] args) throws Exception { 
     Namespace xmlns = DocumentHelper.createNamespace("", "http:/foo.bar"); 
     Element root = DocumentHelper.createElement("root"); 
     root.add(xmlns); 

     Document document = DocumentHelper.createDocument(); 
     document.setRootElement(root); 

     Element child = DocumentHelper.createElement("foo"); 
     child.setText("bar"); 
     root.add(child); 

     OutputFormat format = OutputFormat.createPrettyPrint(); 
     XMLWriter writer = new XMLWriter(System.out, format); 
     writer.write(document); 
    } 
} 

Как удалить дополнительный атрибут из <foo>? Я рад использовать другую библиотеку, если это будет проще.

РЕШЕНИЕ

Ответ ниже вместе с this question помогли решить мою проблему. Я также включил исправленный код ниже:

import org.dom4j.Document; 
import org.dom4j.DocumentHelper; 
import org.dom4j.Element; 
import org.dom4j.Namespace; 
import org.dom4j.io.OutputFormat; 
import org.dom4j.io.XMLWriter; 

public class App { 

    public static void main(String[] args) throws Exception { 
     Document document = DocumentHelper.createDocument(); 
     Element root = document.addElement("root"); 

     Namespace xmlns = Namespace.get("http:/foo.bar"); 
     root.add(xmlns); 

     root.addElement("foo", "http:/foo.bar") 
       .addText("bar"); 

     OutputFormat format = OutputFormat.createPrettyPrint(); 
     XMLWriter writer = new XMLWriter(System.out, format); 
     writer.write(document); 
    } 
} 

ответ

2

Вы говорите, что вы хотите, чтобы каждый узел в дереве, чтобы быть в том же пространстве имен?

Вышеприведенный код явно направляет библиотеку, чтобы поместить дочерний элемент foo в другое пространство имен (в данном случае - по умолчанию или пустое пространство имен) из его родителя. Таким образом, сериализованный XML отражает этот факт! Если вы хотите, чтобы «foo» находилось в одном и том же пространстве имен, вам придется назначить его правильно.

Если вам просто нужно одно пространство имен, я предлагаю рассмотреть назначение пространства имен по умолчанию в dom4j.

+0

Я пробовал JDom и нашел то же поведение, поэтому я ожидаю, что это отражает мое отсутствие понимания ожидаемого поведения. Я нашел аналогичный вопрос о SO для JDom, и ответ заключался в том, чтобы передать пространство имен конструктору каждого элемента документа, который работал для меня. это вы имели в виду? Я не пробовал его с Dom4J, но мне нужно двигаться дальше, пока у меня есть рабочий код, но я ожидаю, что так оно и будет. – Romski

+0

По существу да - каким-то образом вы должны указать каждому элементу свое пространство имен. Также, пожалуйста, пересмотреть свое сообщение как SSCCE (а не выдержку). – chrisinmtown

+0

Что бы вы хотели увидеть для редактирования (это было то, что я, по крайней мере, был наименьшим количеством кода для демонстрации проблемы, за исключением импорта и включения основного метода). – Romski

Смежные вопросы