добавлено пространство имен tag0 для элементов в пространстве имен по умолчанию - PullRequest
16 голосов
/ 08 февраля 2012

Я пытаюсь проанализировать и изменить pom.xml в Maven, используя 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', '')

Ответы [ 3 ]

21 голосов
/ 09 февраля 2012

Вы можете создать XmlSlurper без осведомленности о пространстве имен примерно так:

import groovy.xml.XmlUtil

def pom = new XmlSlurper( false, false ).parse( 'pom.xml' )
println XmlUtil.serialize(pom)

Что должно дать вам ответ, который вы хотите ... В настоящее время нет понятия о том, как поддерживать комментарии во время цикла slurp / serialize: - (

Как вы говорите, это может быть возможно с XmlParser, но мои текущие попытки не увенчались успехом :-( Здесь некоторый код , который может приблизить вас , но пока я не добился успеха: - (

3 голосов
/ 14 февраля 2014

У меня была та же проблема с добавлением «tag0» к элементам, которые не определяли пространство имен (т. Е. Они были в пространстве имен «no namespace»).Я исправил это, добавив

declareNamespace('': '')

, который сбрасывает элементы из пространства имен по умолчанию в пространство имен «без пространства имен».

1 голос
/ 19 мая 2012

Я обнаружил, что лучше использовать XmlParser, а не XmlSlurper, если вы имеете дело с пространствами имен и имеете проблему с tag0.Синтаксически они выглядят одинаково, например:

def root = new XmlParser().parse(new File('example.xml'))
println XmlUtil.serialize(root)

Приведенный выше код выведет файл example.xml в точности так, как он должен быть, включая пространства имен.

Если вы хотите каким-либо образом обработать кореньнапример, найти конкретный узел, использовать Groovy API и вывести результат, например

def root = new XmlParser().parse(new File('example.xml')
def result = root."ns:Element"[0]
println XmlUtil.serialize(result)
...