Groovy XMLSlurper проблема - PullRequest
       18

Groovy XMLSlurper проблема

1 голос
/ 19 сентября 2010

Я хочу разобрать с 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

}

Мое дерево пакетов выглядит так, как показано ниже:

alt text

Я также изменил небольшой код для разбора ответа, поэтому он выглядит следующим образом:

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, и я не могу заставить его работать ...

Ответы [ 2 ]

1 голос
/ 28 ноября 2014

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

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

какthis:

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

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

Примечание:

1 голос
/ 19 сентября 2010

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

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

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

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

...