2010-06-11 3 views
0

Bonjour à tous, J'essaie d'analyser le fragment HTML suivant, et je voudrais obtenir le même fragment que la sortie (sans balises HTML et BODY). Est-ce possible? Si c'est le cas, comment?Analyse de fragment de document XmlSlurper/NekoHTML - Pas de balises HTML ou BODY voulues

Merci Misha

P.S. Je lis ici: http://nekohtml.sourceforge.net/faq.html#fragments et je crois que j'ai ajouté les bonnes options ci-dessous. Cependant, la sortie est toujours incorrecte :(

Merci Misha

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) 

Sortie:

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

Répondre

2

Appel setFeature sur l'objet analyseur directement, comme ceci:

@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

Vous êtes un génie! Merci :) –

Questions connexes