При создании документа с пространством имен по умолчанию <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);
}
}
Я пробовал JDom и нашел то же поведение, поэтому я ожидаю, что это отражает мое отсутствие понимания ожидаемого поведения. Я нашел аналогичный вопрос о SO для JDom, и ответ заключался в том, чтобы передать пространство имен конструктору каждого элемента документа, который работал для меня. это вы имели в виду? Я не пробовал его с Dom4J, но мне нужно двигаться дальше, пока у меня есть рабочий код, но я ожидаю, что так оно и будет. – Romski
По существу да - каким-то образом вы должны указать каждому элементу свое пространство имен. Также, пожалуйста, пересмотреть свое сообщение как SSCCE (а не выдержку). – chrisinmtown
Что бы вы хотели увидеть для редактирования (это было то, что я, по крайней мере, был наименьшим количеством кода для демонстрации проблемы, за исключением импорта и включения основного метода). – Romski