Добавлено пространство имен tag0 для элементов в пространстве имен по умолчанию
Я пытаюсь разобрать и изменить Maven pom.xml с помощью Groovy XmlSlurper. Мой pom.xml объявляет пространство имен xsi.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>a-group-id</groupId>
<artifactId>an-artifact-id</artifactId>
Мой Groovy источник выглядит следующим образом:
import groovy.xml.XmlUtil
def pom = new XmlSlurper().parse('pom.xml')
.declareNamespace('': 'http://maven.apache.org/POM/4.0.0',
xsi: 'http://www.w3.org/2001/XMLSchema-instance')
//manipulate the pom
println XmlUtil.serialize(pom)
Как вы заметили, я объявил первое пространство имен пустым. Однако в выходной тег0 добавляется везде.
<?xml version="1.0" encoding="UTF-8"?>
<tag0:project xmlns:tag0="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<tag0:modelVersion>4.0.0</tag0:modelVersion>
<tag0:groupId>a-group-id</tag0:groupId>
<tag0:artifactId>an-artifact-id</tag0:artifactId>
Как этого избежать?
В настоящий момент мое обходное решение удаляет теги вручную:
println XmlUtil.serialize(pom).replaceAll('tag0:', '').replaceAll(':tag0', '')
Ответы
Ответ 1
Вы можете создать XmlSlurper
без пространства имен следующим образом:
import groovy.xml.XmlUtil
def pom = new XmlSlurper( false, false ).parse( 'pom.xml' )
println XmlUtil.serialize(pom)
Что должно дать вам ответ, который вы хотите... В настоящее время нет идеи о том, как сохранять комментарии во время цикла slurp/serialize: - (
Как вы говорите, это может быть возможно с XmlParser, но мои текущие попытки потерпели неудачу:-( There код здесь, который может поближе, но пока у меня не получилось: - (
Ответ 2
У меня была та же проблема с добавлением "tag0" к элементам, которые не определяли пространство имен (т.е. они находились в пространстве имен "без пространства имен" ). Я исправил это, добавив
declareNamespace('': '')
который сбрасывает элементы из пространства имен по умолчанию в пространство имен "без пространства имен".
Ответ 3
Я обнаружил, что лучше использовать XmlParser, а не XmlSlurper, если вы имеете дело с пространствами имен и имеете проблему tag0. Синтаксически они кажутся одинаковыми, например:
def root = new XmlParser().parse(new File('example.xml'))
println XmlUtil.serialize(root)
Вышеприведенный код выводит example.xml точно так же, как он должен включать пространства имен.
Если вы хотите каким-то образом обработать корень, например, найти конкретный node, используйте API Groovy и выведите результат, например
def root = new XmlParser().parse(new File('example.xml')
def result = root."ns:Element"[0]
println XmlUtil.serialize(result)