2010-06-11 3 views
3

내가이 일을 여러 가지 다른 버전을 사용하고 있지만, 모두가이 오류가 발생하는 것 :HTML에서 멋지게 출력되는 XmlSlurper 출력?

[치명적인 오류] : 1 : 171 : 접두사가 "의 xmlns"가 명시 적으로 네임 스페이스에 바인딩 할 수 없습니다; "xmlns"의 네임 스페이스도 명시 적으로 모든 접두어에 바인딩 할 수 없습니다. 내가 해봤

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

버전 :

나는 같은 HTML을로드

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

0

는 여전히 대답을하지 않지만 그때

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

윌 꽤 인쇄 XmlParser가를 사용하는 경우. 당신이 StreamingMarkupBuilder을받을 경우

또한, 당신이 할 수 있습니다

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

미샤

관련 문제