1

HTTPBuilderを使用して読み取ったHTMLドキュメントを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ファイルを提供するための回避策を見つけました。私はここで役立つはずのクラスの簡単な実装を見つけました:

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あり、動作させることができません...

4

2 に答える 2

1

これらの問題に対処するためにXmlSlurperと組み合わせて使用​​できるHTML解析があります

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

ここでの使用例

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

于 2010-09-19T16:16:38.907 に答える
1

XmlSlurper別のコンストラクターを使用して、解析の問題を解決することができました。

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

このような:

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

私のXMLの場合、検証(1番目のパラメーター)を無効にしfalse、DOCTYPE宣言(3番目のパラメーター)を有効にすることでtrueうまくいきました。

ノート:

于 2014-11-28T19:33:34.497 に答える