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の問題がある場合は、XmlSlurperではなくXmlParserを使用する方がよいことがわかりました。構文的には同じように見えます。例:

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 に答える