2010-06-11 172 views
3

我正在使用幾個不同的版本來做到這一點,但所有似乎都會導致此錯誤:Groovy漂亮打印XmlSlurper從HTML輸出?

[致命錯誤]:1:171:前綴「xmlns」不能顯式綁定到任何名稱空間; 「xmlns」的命名空間也不能明確地綁定到任何前綴。

我加載HTML爲:

// Load html file 
def fis=new FileInputStream("2.html") 
def html=new XmlSlurper(new org.cyberneko.html.parsers.SAXParser()).parseText(fis.text)   

版本我已經試過:

http://johnrellis.blogspot.com/2009/08/hmmm_04.html

import groovy.xml.StreamingMarkupBuilder 
import groovy.xml.XmlUtil 
def streamingMarkupBuilder=new StreamingMarkupBuilder() 
println XmlUtil.serialize(streamingMarkupBuilder.bind{mkp.yield html}) 

http://old.nabble.com/How-to-print-XmlSlurper%27s-NodeChild-with-indentation--td16857110.html

// Output 
import groovy.xml.MarkupBuilder 
import groovy.xml.StreamingMarkupBuilder 
import groovy.util.XmlNodePrinter 
import groovy.util.slurpersupport.NodeChild 

def printNode(NodeChild node) { 
    def writer = new StringWriter() 
    writer << new StreamingMarkupBuilder().bind { 
     mkp.declareNamespace('':node[0].namespaceURI()) 
     mkp.yield node 
    } 
    new XmlNodePrinter().print(new XmlParser().parseText(writer.toString())) 
} 

有什麼建議?

謝謝! 米莎

回答

5

問題是命名空間。這裏是解決方案:

def saxParser=new org.cyberneko.html.parsers.SAXParser() 
saxParser.setFeature('http://xml.org/sax/features/namespaces',false) 
new XmlSlurper(saxParser).parseText(text)  

import groovy.xml.XmlUtil 
println XmlUtil.serialize(new StreamingMarkupBuilder().bind { 
       mkp.yield page 
       }) 

謝謝! Misha

+0

不知道這應該是被接受的答案。 'XmlUtil.serialize'內部將'StreamingMarkupBuilder.bind'返回的'Writable'轉換爲String。這打敗了整個流式傳輸。 – Dave 2018-01-24 10:14:40

0

仍然沒有一個答案,但如果我使用XmlParser的那麼

def html=new XmlSlurper(new org.cyberneko.html.parsers.SAXParser()).parseText(somehtml)   
new XmlNodePrinter(preserveWhitespace:true).print(html) 

請問漂亮打印。

此外,如果你得到一個StreamingMarkupBuilder,你可以這樣做:

import groovy.xml.XmlUtil 
println XmlUtil.serialize(new StreamingMarkupBuilder().bind { 
    ... make your markup here ... 
} 
) 

米莎