tag0名称空间为默认名称空间中的元素添加

sti*_*vlo 17 xml groovy parsing xmlslurper

我正在尝试使用Groovy的XmlSlurper解析和修改Maven的pom.xml.我的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>
Run Code Online (Sandbox Code Playgroud)

我的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)
Run Code Online (Sandbox Code Playgroud)

正如您所注意到的,我已将第一个命名空间声明为空.但是在输出中,tag0随处可见.

<?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>
Run Code Online (Sandbox Code Playgroud)

怎么避免呢?

目前我的解决方法是手动删除标签:

println XmlUtil.serialize(pom).replaceAll('tag0:', '').replaceAll(':tag0', '')
Run Code Online (Sandbox Code Playgroud)

tim*_*tes 22

您可以构造XmlSlurper没有名称空间感知,如下所示:

import groovy.xml.XmlUtil

def pom = new XmlSlurper( false, false ).parse( 'pom.xml' )
println XmlUtil.serialize(pom)
Run Code Online (Sandbox Code Playgroud)

哪个应该给你你想要的答案...目前不知道如何在slurp /序列化周期中保持评论:-(

正如你所说的,有可能使用XmlParser,但我目前的尝试都失败了:-(还有这里的一些代码,可能让你关闭,但至今我没有成功:-(