Проблема с Groovy XMLSlurper

Я хочу проанализировать с помощью XmlSlurper HTML-документ, который я прочитал с помощью HTTPBuilder. Изначально я пытался сделать это так:

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. Зарегистрированный путь DTD из CachedDTD entityResolver равен org/yuri/dtd/xhtml1-transitional.dtd, и я не могу заставить его работать...


person jjczopek    schedule 19.09.2010    source источник


Ответы (2)


есть анализ HTML, который вы могли бы использовать в сочетании с XmlSlurper для решения этих проблем.

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

Пример использования здесь

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

person Aaron Saunders    schedule 19.09.2010

Мне удалось решить проблему синтаксического анализа с помощью другого конструктора XmlSlurper:

public XmlSlurper(логическая проверка, логическая namespaceAware, логическое значение allowDocTypeDeclaration)

как это:

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

В моем случае с XML отключение проверки (1-й параметр false) и включение объявления DOCTYPE (3-й параметр true) помогло.

Примечание:

person t0r0X    schedule 28.11.2014