2010-06-11 5 views
0

친애하는 모든 사람이 다음 HTML 조각을 구문 분석하려고합니다. HTML 및 BODY 태그가없는 출력과 동일한 조각을 얻고 싶습니다. 이것이 가능한가? 그렇다면 어떻게? XmlSlurper/NekoHTML 문서 조각 파싱 - HTML 또는 BODY 태그가 필요 없음

추신 당신에게 미샤 감사 나는 여기에서 읽고있다 : http://nekohtml.sourceforge.net/faq.html#fragments 나는 정확한 옵션을 아래에 추가했다고 생각한다. 그러나, 출력은 여전히 ​​잘못 :(

당신에게 미샤 감사

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


def text=""" 
<div><h2>Test</h2> 
<div>Hi</div> 
</div> 
""" 

// Parse 
def config=new org.cyberneko.html.HTMLConfiguration() 
config.setFeature("http://cyberneko.org/html/features/balance-tags/document-fragment",true) 
def html=new XmlSlurper(new org.cyberneko.html.parsers.SAXParser()).parseText(text)   

// Output 
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())) 
} 
printNode(html) 

출력 : 직접 파서 객체에

<HTML> 
    <tag0:HEAD xmlns:tag0="http://www.w3.org/1999/xhtml"/> 
    <BODY> 
    <DIV> 
     <H2> 
     Test 
     </H2> 
     <DIV> 
     Hi 
     </DIV> 
    </DIV> 
    </BODY> 
</HTML> 

답변

2

통화 setFeature, 그래서 같은 :

@Grab(group='net.sourceforge.nekohtml', module='nekohtml', version='1.9.14') 

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


def text=""" 
<div><h2>Test</h2> 
<div>Hi</div> 
</div> 
""" 

// Parse 
def parser=new org.cyberneko.html.parsers.SAXParser() 
parser.setFeature("http://cyberneko.org/html/features/balance-tags/document-fragment",true) 
def html=new XmlSlurper(parser).parseText(text)   

// Output 
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())) 
} 
printNode(html) 
+0

너는 천재 야! 고마워. :) –