2010-09-19 4 views
1

Я хочу проанализировать с 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 

} 

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

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. Записан ОТД путь от CachedDTD EntityResolver является org/yuri/dtd/xhtml1-transitional.dtd, и я не могу заставить его работать ...

ответ

1

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

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

так:

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

В моем случае XML, отключение проверки (первый параметр false) и включение декларации DOCTYPE (третий параметр true) сделал трюк.

Примечание: