2012-02-08 16 views
10

Groovy's XmlSlurper kullanarak Maven's pom.xml dosyasını ayrıştırmaya ve değiştirmeye çalışıyorum. Benim pom.xml ad alanı xsi'yi bildirir. aşağıdaki gibitag0 ad alanı varsayılan ad alanındaki öğeler için eklendi

<?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> 

Benim Groovy kaynağıdır: Fark gibi

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) 

, ben ilk ad olarak boş ilan ettik. Ancak çıktı etiketinde0 her yere eklenir.

<?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> 

Bundan nasıl korunulur?

an için benim geçici çözüm elle etiketleri kaldırıyor:

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

'XmlSlurper' ismini isimsiz olarak oluşturmak tanrıya yeterince destek veriyor mu? yani: println XmlUtil.serialize (yeni XmlSlurper (false, false) .parse ('pom.xml')) '? –

+0

Vay, evet, bu zaten yeterliydi, teşekkürler Tim. bir cevap olarak sağlayabilir misiniz? Ayrıca, XML'deki tüm yorumların kaybolduğunu fark ettim, bunun için herhangi bir geçici çözüm biliyor musunuz? BTW, burada [pomRm] (http://www.stefanolocati.it/blog/?p=1226) ve [pomVersions] yazdığım iki araç var (http://www.stefanolocati.it/blog/?p= 1220 kişi). – stivlo

+0

Şu anda yorumları nasıl tutacağınızı göremiyor musunuz: ... (Bu öğleden sonra boş bir an olsun diye düşüneceğim ... –

cevap

16

Öyle gibi hiçbir namespace awareness ile XmlSlurper oluşturabilirsiniz:

import groovy.xml.XmlUtil 

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

size istediğiniz cevabı vermelidir hangisi .. Şu anda slurp/serileştirme döngüsü sırasında yorumları nasıl sürdüreceğiniz hakkında bir fikir yok :-(

Söylediğiniz gibi, XmlParser ama benim şimdiki girişimleri var :-(başarısız olmuş kapatmak çekebilirsin ama henüz ben

+0

Teşekkür ederim Tim, bu çalışmalar, hafta sonu deneyeceğim yorumlar için. – stivlo

+0

CommentCollectingParser, bir düğümden önceki yorumları bulmak için çalışır, örneğin, bir yorum yazdırmak için: * def ayrıştırıcı = new CommentCollectingParser(); def root = parser.parse (yeni Dosya ('plan.xml')); println parser.commentsFor (root.week [0]); * Ancak, tüm XML'i yazdırmaya çalışırsam, bunlar dahil edilmez. * def yazar = yeni StringWriter(); yeni XmlNodePrinter (yeni PrintWriter (yazıcı)) yazdırma (kök); println writer.toString(); * [XmlParser JavaDoc] 'da (http://groovy.codehaus.org/api/groovy/util/XmlParser.html) aslında şöyle derler: * Bu ayrıştırıcı, yorumları ve işlem talimatlarını dikkate almaz * – stivlo

+0

Benim için de çalışması. – Pushkar

1

Ben yerine XmlParser kullanmak daha iyidir bulundu :-(hiçbir başarı elde ettik some code here İsim alanlarıyla uğraşırken ve tag0 problemine sahipseniz XmlSlurper. o ad dahil edilmelidir tam olarak çıkış example.xml olur

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

yukarıdaki kodu: sözdizimsel aynı, örneğin görünüyor. Eğer örneğin, bir şekilde kök işlemek belirli düğüm bulmak istiyorsanız

, ben eklenmeye "tag0" ile aynı sorunu vardı Groovy API ve sonucu çıkartabilir, örneğin

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

kullanmak Bir isim alanını tanımlamayan öğeler (yani "isimsiz" isim alanındaydı). "Hayır ad" ad alanında olmak üzere varsayılan ad olmaktan unsurları sıfırlar

declareNamespace('': '') 

ekleyerek bu sabit.