2010-04-30 43 views
1

我正在編寫代碼,從Web api檢索XML,然後使用Groovy分析該XML。不幸的是,當調用.text()時,Groovy的XmlParser和XmlSlurper都會從節點的屬性中剝離換行符。Groovy條帶中的XML解析屬性新行

如何獲取屬性的文本,包括新行?

示例代碼:

def xmltest = ''' 
<snippet> 
    <preSnippet att1="testatt1" code="This is line 1 
    This is line 2 
    This is line 3" > 
     <lines count="10" /> 
    </preSnippet> 
</snippet>''' 

def parsed = new XmlParser().parseText(xmltest) 
println "Parsed" 
parsed.preSnippet.each { pre -> 
     println pre.attribute('code'); 
} 


def slurped = new XmlSlurper().parseText(xmltest) 
println "Slurped" 
slurped.children().each { preSnip -> 
    println [email protected]() 
    } 

的輸出是:

Parsed 
This is line 1 This is line 2 This is line 3 
Slurped 
This is line 1 This is line 2 This is line 3 

好吧,我能夠將文本轉換之前我解析它,然後重新轉換後,一拉:

def newxml = xmltest.replaceAll(/code="[^"]*/) { 
    return it.replaceAll(/\n/, "~#~") 
} 
def parsed = new XmlParser().parseText(xmltest) 
def code = pre.attribute('code').replaceAll("~#~", "\n") 

不是我最喜歡的黑客,但它會做,直到他們修復他們的XML輸出。

回答

2

屬性中不支持新行 - 這是來自XML規範。他們結束了「正常化」,在這種情況下,這意味着它們被替換爲空格字符。看到這部分的規範:http://www.w3.org/TR/REC-xml/#AVNormalize

我的團隊有這個問題,我們的解決方案是切換到使用元素,而不是屬性。

+0

這是很好的知道,我已經通知那些生成XML,他們做錯了......任何機會,你有一種方法來替換XML文件的屬性與另一回車回車字符串我可以把回到回車時,當我閱讀文本?在我等待真正的XML更改時,這是一個可以解決這個問題的黑客技術。 – billjamesdev 2010-04-30 20:56:04

+0

你可以嘗試玩弄角色引用,如果這不起作用,可以自己處理自定義的可替換序列。 – SteveD 2010-05-01 07:30:08

0

我想你是在誤讀XML規範。換行符在屬性值中是允許的,但是如果屬性的聲明值是標記化類型之一,則空白標準化。