обновить NamespaceURI узла в XML-документе

У меня есть следующий фрагмент кода:

root = parser.parse(xmldoc)
Node item = root.children().find { it.name().getLocalPart() == element }
if (item) {
    // update namespace uri
}  

Ниже приведен пример:

<ct:Description xmlns:ct="http://somewhere.com">Semi-mechanistic modelling of the tumour growth inhibitory effects of LY2157299</ct:Description>

Я получаю URI пространства имен, используя метод getNamespaceURI() для объекта item.name(). В настоящее время, как я могу обновить это свойство.

Если я распечатаю свойства item.name(), они включают:

[localPart:Description, class:class groovy.xml.QName, qualifiedName:ct:Description, prefix:ct, namespaceURI:http://somewhere.com]

person Tung    schedule 04.04.2016    source источник


Ответы (1)


Обсуждая это с моим товарищем по команде сегодня утром, мы нашли решение. Чтобы обновить пространство имен, вы можете использовать метод replaceNode. Детали решения представлены ниже:

import groovy.xml.QName
import groovy.xml.XmlUtil
import javax.xml.parsers.ParserConfigurationException
import org.xml.sax.SAXException
import java.util.concurrent.ThreadLocalRandom as R

File f = new File("/tmp/test.xml")
f.exists()

String elem = "Description"
int count = R.current().nextInt(0, Integer.MAX_VALUE)
String value = "my example value ${count}"
String elemNs = "http://www.somewhere.else/oldns"
String newElemNs = "http://www.somewhere.else/newns"

XmlParser parser = new XmlParser(false, true)
def root = parser.parse(f)
Node item = root.children().find { it.name().getLocalPart() == elem }
item.name = new QName(newElemNs, item.name().getLocalPart(),item.name().getPrefix())
XmlUtil.serialize(root, new BufferedWriter(new FileWriter(f)))

Приведенный выше снимок предназначен для обновления пространства имен узла, найденного в XML-документе. Затем сохраните изменения обратно в файл.

person Tung    schedule 05.04.2016