我想用HTTPBuilder解析一个我读到的XmlSlurper文档。一开始我试着这样做:
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文件。我找到了一个简单的类实现,它应该对here有帮助
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
,我无法使其正常工作...
发布于 2010-09-20 00:16:39
有一个HTML可以与XmlSlurper结合使用来解决这些问题
http://sourceforge.net/projects/nekohtml/
这里的示例用法
http://groovy.codehaus.org/Testing+Web+Applications
发布于 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
)就成功了。
注意:
https://stackoverflow.com/questions/3745240
复制相似问题