Я хочу проанализировать с XmlSlurper документ HTML, который я читаю с помощью HTTPBuilder. Initialy Я пытался сделать это таким образом:Groovy XMLSlurper issue
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 является org/yuri/dtd/xhtml1-transitional.dtd
, и я не могу заставить его работать ...