Я имею дело с уже созданным объектом Document. Я должен уметь устанавливать базовое пространство имен (имя атрибута "xmlns" ) на определенное значение. Мой ввод DOM и что-то вроде:
<root>...some content...</root>
Мне нужен DOM, который выглядит примерно так:
<root xmlns="myNamespace">...some content...</root>
Что это. Легко, не так ли? Неправильно! Не с DOM!
Я пробовал следующее:
1) Использование doc.getDocumentElement(). setAttribute ( "xmlns", "myNamespace" )
Я получаю документ с пустым xmlns (он работает с любым именем другого атрибута!)
<root xmlns="">...</root>
2) Использование renameNode (...)
Первый клон документ:
Document input = /*that external Document whose namespace I want to alter*/;
DocumentBuilderFactory BUILDER_FACTORY_NS = DocumentBuilderFactory.newInstance();
BUILDER_FACTORY_NS.setNamespaceAware(true);
Document output = BUILDER_NS.newDocument();
output.appendChild(output.importNode(input.getDocumentElement(), true));
Мне действительно недостает document.clone(), но, возможно, это только я.
Теперь переименуйте корень node:
output.renameNode(output.getDocumentElement(),"myNamespace",
output.getDocumentElement().getTagName());
Теперь не , что просто?;)
Теперь я получаю:
<root xmlns="myNamespace">
<someElement xmlns=""/>
<someOtherElement xmlns=""/>
</root>
Итак (как мы все ожидали, правильно?), это переименовывает пространство имен только из корня node.
Проклятие, DOM!
Есть ли способ сделать это рекурсивно (без написания собственного рекурсивного метода)?
Пожалуйста, помогите;)
Пожалуйста, не советуйте мне делать какое-то причудливое обходное решение, например, преобразование DOM в что-то еще, измените там пространство имен и преобразуйте его обратно. Мне нужен DOM, потому что это самый быстрый стандартный способ манипулирования XML.
Примечание. Я использую последний JDK.
ИЗМЕНИТЬ
Удалены неверные предположения из вопроса, связанного с префиксом пространства имен.