2008-10-22 67 views
4

當我使用此代碼輸出一些XML我解析(和修飾的)使用XmlParser如何打印保存名稱空間的groovy節點?

XmlParser parser = new XmlParser() 
def root = parser.parseText(feedUrl.toURL().text) 
def writer = new StringWriter() 
new XmlNodePrinter(new PrintWriter(writer)).print(root) 
println writer.toString() 

在根節點上的命名空間聲明不打印,即使它們有在根的toString() ...有什麼想法?

回答

1

它看起來像是對輸出進行非規格化處理,並且包含名稱空間上下文以及實際需要名稱空間上下文的節點。

例如,對於這個問題的網頁來與嵌入式項目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源代碼實際上非常易讀,如果你真的需要這個,不會那麼難修改。

3

我剛剛遇到了同樣的問題,經過一番摸索,我找到了一個解決方法。

您使用XmlSluper代替XmlParser的和使用StreamingMarkupBuilder,而不是XmlNodePrinter。然後利用關閉綁定並使用mkp內置變量來聲明命名空間。

例如;使用從上面Ted的源XML示例:

def root = new XmlSlurper().parseText("http://stackoverflow.com/feeds/question/227447".toURL().text)) 
def outputBuilder = new StreamingMarkupBuilder() 
String result = XmlUtil.serialize(outputBuilder.bind { 
    mkp.declareNamespace('':'http://www.w3.org/2005/Atom') 
    mkp.declareNamespace('creativeCommons':'http://backend.userland.com/creativeCommonsRssModule') 
    mkp.declareNamespace('re':'http://purl.org/atompub/rank/1.0') 
    mkp.yield root } 
) 
println result 

結果:

<?xml version="1.0" encoding="UTF-8"?><feed xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns="http://www.w3.org/2005/Atom" xmlns:re="http://purl.org/atompub/rank/1.0"> 
<title type="text">How do I print a groovy Node with namespace preserved? - Stack Overflow </title> 
<link rel="self" type="application/atom+xml" href="http://stackoverflow.com/feeds/question/227447"/> 
<link rel="alternate" type="text/html" href="http://stackoverflow.com/questions/227447"/> 
<subtitle>most recent 30 from stackoverflow.com</subtitle> 
<updated>2011-02-16T05:13:17Z</updated> 
<id>http://stackoverflow.com/feeds/question/227447</id> 
<creativeCommons:license>http://www.creativecommons.org/licenses/by-nc/2.5/rdf</creativeCommons:license> 
<entry> 
<id>http://stackoverflow.com/questions/227447/how-do-i-print-a-groovy-node-with-namespace-preserved</id> 
<re:rank scheme="http://stackoverflow.com">2</re:rank> 
相關問題