2012-05-30 61 views
5

我正在從維基頁面失去重要的空白我解析,我想這是因爲解析器。我有這在我的Groovy腳本:XMLParser正在吃我的空白

@Grab(group='org.ccil.cowan.tagsoup', module='tagsoup', version='1.2') 
def slurper = new XmlSlurper(new org.ccil.cowan.tagsoup.Parser()) 
slurper.keepWhitespace = true 
inputStream.withStream{ doc = slurper.parse(it) 
println "originalContent = " + doc.'**'.find{ [email protected] == 'editpageform' }.'**'.find { [email protected]=='originalContent'}[email protected] 
} 

如果InputStream爲從URL GET請求初始化編輯匯合維基頁面。 後來在withInputStream塊,我這樣做:

println "originalContent = " + doc.'**'.find{ [email protected] == 'editpageform' }.'**'.find { [email protected]=='originalContent'}[email protected] 

我注意到頁面的所有原始內容剝奪了換行符。我原本以爲這是一個服務器端的事情,但當我在瀏覽器中查看相同的請求並查看源代碼時,我可以在「originalContent」隱藏參數中看到換行符。有沒有簡單的方法來禁用空白標準化並保留字段的內容?上面是針對內部的Confluence wiki頁面運行的,但是在編輯任意的wiki頁面時很可能會被責備。

更新上述 我試圖保留空白添加調用「slurped.keepWhitespace =真」,但仍然無法正常工作。我在想這個方法是針對元素而不是屬性的?有沒有辦法輕鬆調整底層Java XMLParser上的標誌?是否有特定的設置來設置屬性值中的空白?

+0

這就是當你把你的解析器餓;-)(我很抱歉,我無法抗拒) – dasblinkenlight

+0

所以,如果你說whitespache,你的意思是隻換行發生了什麼?如果你說換行符部分沒有被刪除,它們只會被轉換? Afaik XML僅換行換行。 – blackdrag

+3

我相信在[Groovy JIRA]中有一個問題(http://jira.codehaus.org/browse/GROOVY-5360) –

回答

1

我第一次嘗試用我自己的一些匯合頁面複製本,但沒有價值屬性,在輸入節點沒有文本內容,所以我創造了我自己的測試HTML。現在

,我想通了tagsoup解析器將需要進行配置,以保留空白太多,只設置這個就slurper不會幫助,因爲默認是忽略空白。

所以,我已經做到了這一點,tagsoup feature ignorable-whitespace被BTW記錄。 (搜索頁面上的空白)

無論如何,它不起作用。您可以從示例中看到保留屬性的空白,並且保留文本空白似乎不起作用,儘管設置了額外的功能。也許這是tagsoup或xml slurper中的錯誤?

我建議你仔細看看你的html,是否真的存在一個值屬性?

@Grab(group='org.ccil.cowan.tagsoup', module='tagsoup', version='1.2') 

String html = """\ 
<html><head><title>test</title></head><body> 
<p> 
    <form id="editpageform"> 
     <p> 
      <input name="originalContent" value="   ">   

      </input> 
     </p> 
    </form> 
</p> 
</body></html> 
""" 
def inputStream = new ByteArrayInputStream(html.getBytes()) 

def parser = new org.ccil.cowan.tagsoup.Parser() 
parser.setFeature("http://www.ccil.org/~cowan/tagsoup/features/ignorable-whitespace", true) 

def slurper = new XmlSlurper(parser) 
slurper.keepWhitespace = true 

inputStream.withStream{ doc = slurper.parse(it) 
    def parse = { doc.'**'.find{ [email protected] == 'editpageform' }.'**'.find { [email protected]=='originalContent'} } 
    println "originalContent (name) = '${parse()[email protected]}'" 
    println "originalContent (value) = '${parse()[email protected]}'" 
    println "originalContent (text) = '${parse().text()}'" 
} 
+0

感謝您對此的闡述。爲了更好地突出我的問題,我將幾個腳本的修改版本加入其中。 – Cliff

+0

你說得對。我GOOGLE了一些,看來這根本不起作用。雖然換行符在屬性中被允許,但它們被標準化了。但這裏有一個解決方法概述:http://stackoverflow.com/questions/2746876/xml-parsing-in-groovy-strips-attribute-new-lines – stackmagic

0

看起來新行並沒有保存在value屬性中。請看下圖:

@Grab(group='org.ccil.cowan.tagsoup', module='tagsoup', version='1.2') 

String html = """\ 
<html><head><title>test</title></head><body> 
<p> 
    <form id="editpageform"> 
     <p> 
      <input name="originalContent" value=" 



        ">   

      </input> 
     </p> 
    </form> 
</p> 
</body></html> 
""" 
def inputStream = new ByteArrayInputStream(html.getBytes()) 

def parser = new org.ccil.cowan.tagsoup.Parser() 
parser.setFeature("http://www.ccil.org/~cowan/tagsoup/features/ignorable-whitespace", true) 

def slurper = new XmlSlurper(parser) 
slurper.keepWhitespace = true 

inputStream.withStream{ doc = slurper.parse(it) 
    def parse = { doc.'**'.find{ [email protected] == 'editpageform' }.'**'.find { [email protected]=='originalContent'} } 
    println "originalContent (name) = '${parse()[email protected]}'" 
    println "originalContent (value) = '${parse()[email protected]}'" 
    println "originalContent (text) = '${parse().text()}'" 
    assert parse()[email protected]().contains('\n') : "Should contain a newline" 
}