Java + DOM: как элегантно переименовать атрибут xmlns: xyz? - PullRequest
0 голосов
/ 04 августа 2009

У меня есть что-то подобное в качестве ввода:

<root xmlns="urn:my:main" 
    xmlns:a="urn:my:a" xmlns:b="urn:my:b">

    ...
</root>

И хотите иметь что-то подобное в качестве вывода:

<MY_main:root xmlns:MY_main="urn:my:main" 
    xmlns:MY_a="urn:my:a" xmlns:MY_b="urn:my:b">

    ...
</MY_main:root>

... или наоборот.

Как мне добиться этого, используя DOM элегантным способом?
То есть без поиска имен атрибутов, начинающихся с "xmlns".

Ответы [ 2 ]

1 голос
/ 04 августа 2009

Вы не найдете атрибуты xmlns в вашей DOM, они не являются частью DOM.

Вы можете добиться некоторого успеха, если найдете нужные узлы (getElementsByTagNameNS) и установите для их qualName (qname) новое значение, содержащее префикс, который вам нравится. Затем заново сгенерируйте документ XML.

Кстати, префикс пространства имен (который вы пытаетесь изменить) в значительной степени не имеет значения при использовании любого здравомыслящего анализатора XML. URI пространства имен имеет значение. Почему вы хотите установить префикс на определенное значение?

0 голосов
/ 05 августа 2009

Я использовал следующую заглушку jdom для удаления всех ссылок на пространство имен:

Element rootElement = new SAXBuilder().build(contents).getRootElement();

for (Iterator i = rootElement.getDescendants(new ElementFilter()); i.hasNext();) {
    Element el = (Element) i.next();
    if (el.getNamespace() != null) el.setNamespace(null);
}

return rootElement;

Чтение и запись xml выполняется как обычно. Если вы только после того, как вы читаете человека, это должно сделать работу. Однако, если вам нужно конвертировать обратно, у вас могут быть проблемы.

Следующее может помочь заменить пространства имен более удобной версией на основе вашего примера (не проверено):

rootElement.setNamespace(Namespace.getNamespace("MY_Main", "urn:my:main"));
rootElement.addNamespaceDeclaration(Namespace.getNamespace("MY_a", "urn:my:a"))
rootElement.addNamespaceDeclaration(Namespace.getNamespace("MY_b", "urn:my:b"))
...