Groovy довольно печатать вывод XmlSlurper из HTML? - PullRequest
4 голосов
/ 11 июня 2010

Я использую несколько разных версий для этого, но все, кажется, приводят к этой ошибке:

[Фатальная ошибка]: 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()))
}

Любой совет?

Спасибо! Миша

Ответы [ 2 ]

5 голосов
/ 14 июня 2010

Проблема в пространствах имен. Вот решение:

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
              })

Спасибо! Миша

0 голосов
/ 14 июня 2010

Ответа пока нет, но если я использую 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 ...
}
) 

Misha

...