18

我正在尝试使用 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>

我的 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)

如您所见,我已将第一个命名空间声明为空。但是,在输出中到处都添加了 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>

如何避免这种情况?

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

println XmlUtil.serialize(pom).replaceAll('tag0:', '').replaceAll(':tag0', '')
4

3 回答 3

24

您可以像这样构建XmlSlurper没有命名空间意识的:

import groovy.xml.XmlUtil

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

哪个应该给你你想要的答案......目前不知道如何在 slurp/serialize 周期中维护评论:-(

正如你所说,使用 XmlParser 可能是可行的,但我目前的尝试失败了:-(这里有一些代码可能会让你接近,但到目前为止我还没有成功:-(

于 2012-02-09T16:06:36.887 回答
4

我有同样的问题,“tag0”被添加到没有定义命名空间的元素中(即它们在“无命名空间”命名空间中)。我通过添加解决了这个问题

declareNamespace('': '')

它将元素从默认命名空间重置为“无命名空间”命名空间。

于 2014-02-14T17:12:30.080 回答
1

我发现如果您正在处理命名空间并遇到 tag0 问题,那么使用 XmlParser 而不是 XmlSlurper 会更好。从语法上看,它们看起来是一样的,例如:

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)
于 2012-05-19T10:17:49.063 回答