2011-02-28 80 views
8

這是我的Groovy代碼:如何使用Parser實例將XML寫入文件?

// ... 
def xml = new XmlParser().parse(fileName) 
xml.each { e -> 
    // some changes are being made to XML 
    xml.append("test", "test me") 
} 
def writer = new FileWriter(newFileName) 
new XmlNodePrinter(new PrintWriter(writer)).print(xml) 

代碼工作,但輸出XML有很多不必要的空白空間。看起來我在寫文件時做錯了什麼。

ps。感謝Tim,這是它應該如何工作(以上就要用這些三行被替換的例子的最後一行):

def printer = new XmlNodePrinter(new PrintWriter(writer)) 
printer.preserveWhitespace = true 
printer.print(xml) 

回答

12

如果更換,會發生什麼:

def writer = new FileWriter(newFileName) 
new XmlNodePrinter(new PrintWriter(writer)).print(xml) 

有:

new File(newFilename).withWriter { out -> 
    printer = new XmlNodePrinter(out) 
    printer.preserveWhitespace = true 
    printer.print(xml) 
} 

- 編輯 -

由於指出,那感覺就像它應該是preserveWhitespace = false,但是如果你嘗試下面的測試代碼:

def x = """<langs type="current"> 
    <language>Java</language> 
    <language>Groovy</language> 
    <language>JavaScript</language> 
</langs>""" 

def xml = new XmlParser().parseText(x) 
xml.appendNode 'language', 'Ruby' 

def printIt = { node, pw -> 
    println "With preserveWhitespace=$pw:" 
    def s = new StringWriter() 
    printer = new XmlNodePrinter(new PrintWriter(s)) 
    printer.preserveWhitespace = pw 
    printer.print(xml) 
    println s 
} 

printIt xml, true 
printIt xml, false 

你得到的輸出:

With preserveWhitespace=true: 
<langs type="current"> 
    <language>Java</language> 
    <language>Groovy</language> 
    <language>JavaScript</language> 
    <language>Ruby</language> 
</langs> 

With preserveWhitespace=false: 
<langs type="current"> 
    <language> 
    Java 
    </language> 
    <language> 
    Groovy 
    </language> 
    <language> 
    JavaScript 
    </language> 
    <language> 
    Ruby 
    </language> 
</langs> 
+0

如果問題是他的輸出中有太多空白,他不應該使用'preserveWhitespace = false'嗎? – pmartin 2011-02-28 16:02:03

+0

@pmartin增加了一個例子 – 2011-02-28 16:14:58

+0

謝謝。我在我的問題中總結了你的答案:)我不明白爲什麼它必須這麼長(答案),但無論如何,非常感謝。 – yegor256 2011-02-28 17:41:36

0

我結束了與此導語:

new File(myFilename).withWriter { 
    def printer = new XmlNodePrinter(new PrintWriter(it)) 
    printer.preserveWhitespace = true 
    printer.print(myXmlNode) 
}