-->

Groovy中的XmlSlurper问题(Groovy XMLSlurper issue)

2019-09-25 16:34发布

我想这是我使用HTTPBuilder读的XmlSlurper一个HTML文档进行解析。 Initialy我试图做这种方式:

def response = http.get(path: "index.php", contentType: TEXT)
def slurper = new XmlSlurper()
def xml = slurper.parse(response)

但它会产生一个例外:

java.io.IOException: Server returned HTTP response code: 503 for URL: http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd

我发现了一个解决办法,以提供缓存DTD文件。 我发现了一个简单的实现类应该帮助这里 :

class CachedDTD {
/**
 * Return DTD 'systemId' as InputSource.
 * @param publicId
 * @param systemId
 * @return InputSource for locally cached DTD.
 */
  def static entityResolver = [
          resolveEntity: { publicId, systemId ->
            try {
              String dtd = "dtd/" + systemId.split("/").last()
              Logger.getRootLogger().debug "DTD path: ${dtd}"
              new org.xml.sax.InputSource(CachedDTD.class.getResourceAsStream(dtd))
            } catch (e) {
              //e.printStackTrace()
              Logger.getRootLogger().fatal "Fatal error", e
              null
            }
          }
  ] as org.xml.sax.EntityResolver

}

我的包树看起来如下图所示:

我还修改了一些代码解析响应,所以它看起来是这样的:

def response = http.get(path: "index.php", contentType: TEXT)
def slurper = new XmlSlurper()
slurper.setEntityResolver(org.yuri.CachedDTD.entityResolver)
def xml = slurper.parse(response)

但现在我越来越java.net.MalformedURLException 。 从CachedDTD EntityResolver的记录DTD路径是org/yuri/dtd/xhtml1-transitional.dtd ,我无法得到它的工作...

Answer 1:

还有就是你可以使用,同时配合的XmlSlurper解决这些问题的一个HTML解析

http://sourceforge.net/projects/nekohtml/

样品使用率这里

http://groovy.codehaus.org/Testing+Web+Applications



Answer 2:

我可以使用另一种解决我的问题解析XmlSlurper构造函数:

公众的XmlSlurper(布尔验证,布尔namespaceAware,布尔allowDocTypeDeclaration)

像这样:

def parser = new XmlSlurper(false, false, true)

在我的XML的情况下,禁用验证(第一个参数false ),并启用DOCTYPE声明(第三个参数true )的伎俩。

注意:



文章来源: Groovy XMLSlurper issue