它看起來像是對輸出進行非規格化處理,並且包含名稱空間上下文以及實際需要名稱空間上下文的節點。
例如,對於這個問題的網頁來與嵌入式項目Creativecommons命名空間:
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:thr="http://purl.org/syndication/thread/1.0">
<!-- snip -->
<creativeCommons:license>http://www.creativecommons.org/licenses/by-nc/2.5/rdf</creativeCommons:license>
<!-- snip -->
</feed>
當你輸出使用該腳本的XML:
def root = new XmlParser().parseText("http://stackoverflow.com/feeds/question/227447".toURL().text)
println new XmlNodePrinter().print(root)
它結束了移動的命名空間的需要該名稱空間的許可證節點。在這種情況下不是一個大問題,因爲該名稱空間中只有一個節點。如果大部分XML都是命名空間的話,它可能會讓事情變得更糟。
<feed xmlns="http://www.w3.org/2005/Atom">
<!-- snip -->
<creativeCommons:license xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule">
http://www.creativecommons.org/licenses/by-nc/2.5/rdf
</creativeCommons:license>
<!-- snip -->
</feed>
如果你其實想的節點歸一化,你就必須做出一些調整至XmlNodePrinter通過XML做2遍,首先要收集所有使用的命名空間和第二輸出它們的頂部而不是在每個名稱空間節點內。 groovy源代碼實際上非常易讀,如果你真的需要這個,不會那麼難修改。