2012-02-08 16 views
10

मैं ग्रोवी के एक्सएमएलस्लपर का उपयोग करके मैवेन के pom.xml को पार्स और संशोधित करने का प्रयास कर रहा हूं। मेरा pom.xml नामस्थान xsi घोषित करता है।टैग 0 नेमस्पेस डिफ़ॉल्ट नामस्थान में तत्वों के लिए जोड़ा गया

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

मेरे ग्रूवी स्रोत इस प्रकार है:

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', '') 
+1

'XmlSlurper' का निर्माण कोई नामस्थान समर्थन के साथ पर्याप्त नहीं है? यानी: 'println XmlUtil.serialize (नया XmlSlurper (झूठा, झूठा) .parse (' pom.xml ')) '? –

+0

वाह, हाँ, वह पहले से ही पर्याप्त था, धन्यवाद टिम। क्या आप इसे उत्तर के रूप में प्रदान कर सकते हैं? मैंने यह भी देखा है कि एक्सएमएल में सभी टिप्पणियां खो गई हैं, क्या आप इसके लिए कोई कामकाज जानते हैं? बीटीडब्लू, यहां दी गई दो उपयोगिताएं हैं [pomRm] (http://www.stefanolocati.it/blog/?p=1226) और [pomVersions] (http://www.stefanolocati.it/blog/?p= 1220)। – stivlo

+0

इस समय टिप्पणियां कैसे बनाए रख सकते हैं ... :-(मुझे लगता है कि अगर मुझे आज दोपहर एक खाली पल मिल जाए तो मुझे लगता है कि ... –

उत्तर

16

तुम इतनी तरह कोई namespace awareness साथ XmlSlurper निर्माण कर सकते हैं:

import groovy.xml.XmlUtil 

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

जो तुम जवाब आप चाहते हैं देना चाहिए .. वर्तमान में स्लर्प/सीरियलाइज चक्र के दौरान टिप्पणियों को बनाए रखने के बारे में कोई विचार नहीं :-(

जैसा कि आप कहते हैं, यह संभव हो सकता है XmlParser, लेकिन मेरे वर्तमान प्रयास विफल रहे हैं :-(है some code here जो आप बंद हो सकती है, लेकिन अभी तक मैं :-(

+0

टिप्पणियां जारी करने के लिए टिम, यह काम करता है, मैं सप्ताहांत में कोशिश करूंगा। – stivlo

+0

CommentCollectingParser तो उदाहरण के लिए, एक टिप्पणी मुद्रित करने के लिए एक नोड पूर्ववर्ती टिप्पणियों को ढूंढना, काम करता है: * डीईएफ़ पार्सर = नए CommentCollectingParser(); डीईएफ़ जड़ = parser.parse (नई फ़ाइल ('plan.xml')); println parser.commentsFor (root.week [0]), * हालांकि, अगर मैं पूरी एक्सएमएल मुद्रित करने के लिए प्रयास करते हैं, वे शामिल नहीं हैं। * डीफ लेखक = नया स्ट्रिंगवाइटर(); नई XmlNodePrinter (नई PrintWriter (लेखक)) प्रिंट (रूट)। println writer.toString(); * [XmlParser JavaDoc] (http://groovy.codehaus.org/api/groovy/util/XmlParser.html), वास्तव में वे कहते हैं में: * इस पार्सर टिप्पणियों और प्रोसेसिंग निर्देश पर ध्यान नहीं देता * – stivlo

+0

मेरे लिए भी यह काम है। – Pushkar

1

मैंने पाया कि यह बजाय XmlParser उपयोग करने के लिए बेहतर है कोई सफलता मिली है XmlSlurper यदि आप नेमस्पेस से निपट रहे हैं और टैग 0 समस्या रखते हैं।

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

ऊपर कोड उत्पादन example.xml वास्तव में यह नामस्थान सहित किया जाना चाहिए के रूप में होगा: वाक्य रचना वे एक ही है, जैसे लगते हैं।

आप किसी तरह से जड़ की प्रक्रिया, जैसे एक विशिष्ट नोड को खोजने के लिए चाहते हैं, ग्रूवी एपीआई और आउटपुट परिणाम, जैसे

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

का उपयोग मैं "tag0" में जोड़े जाने के साथ एक ही मुद्दा था तत्व जो नामस्थान को परिभाषित नहीं करते थे (यानी वे "नो नेमस्पेस" नामस्थान में थे)। मैं

declareNamespace('': '') 

जो "कोई नाम स्थान" नाम स्थान में किया जा रहा करने के लिए डिफ़ॉल्ट नाम स्थान में होने से तत्वों को रीसेट करता है जोड़कर इस तय की।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^