首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Groovy XMLSlurper问题

Groovy XMLSlurper问题
EN

Stack Overflow用户
提问于 2010-09-19 17:58:32
回答 2查看 1.7K关注 0票数 1

我想用HTTPBuilder解析一个我读到的XmlSlurper文档。一开始我试着这样做:

代码语言:javascript
运行
复制
def response = http.get(path: "index.php", contentType: TEXT)
def slurper = new XmlSlurper()
def xml = slurper.parse(response)

但它会产生一个异常:

代码语言:javascript
运行
复制
java.io.IOException: Server returned HTTP response code: 503 for URL: http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd

我找到了一种解决方法来提供缓存的DTD文件。我找到了一个简单的类实现,它应该对here有帮助

代码语言:javascript
运行
复制
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

}

我的包树如下所示:

我还修改了一些用于解析响应的代码,因此它看起来如下所示:

代码语言:javascript
运行
复制
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,我无法使其正常工作...

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-20 00:16:39

有一个HTML可以与XmlSlurper结合使用来解决这些问题

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

这里的示例用法

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

票数 1
EN

Stack Overflow用户

发布于 2014-11-29 03:33:34

我能够通过使用另一个XmlSlurper构造函数来解决解析问题:

public XmlSlurper(boolean validating, boolean namespaceAware, boolean allowDocTypeDeclaration)

如下所示:

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

在我的XML示例中,禁用验证(第一个参数false)并启用DOCTYPE声明(第三个参数true)就成功了。

注意:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3745240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档