1

この小さなスクリプトが Groovy で実行されない理由を理解しようとしています。

def url = "http://danvega.org/blog/rss.cfm"
def feed = new XmlSlurper().parse(url)

それを実行しようとすると、次のエラーが発生します。

[Fatal Error] index.cfm:39:23: The reference to entity "postID" must end with the ';' delimiter.
Exception thrown

org.xml.sax.SAXParseException: The reference to entity "postID" must end with the ';' delimiter.
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1231)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
    at groovy.util.XmlSlurper.parse(XmlSlurper.java:147)
    at groovy.util.XmlSlurper.parse(XmlSlurper.java:213)
    at groovy.util.XmlSlurper$parse$0.call(Unknown Source)
    at ConsoleScript20.run(ConsoleScript20:3)
    at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1249)

XML に postID への参照が見当たりません。RSS リーダーでこの xml を使用できるので、私の側で何かが正しい (そして間違っている) に違いありません。誰がこれを引き起こすのか知っていますか?

4

1 に答える 1

2

なんらかの理由で (ブラウザのスニッフィングが原因だと思いますか?)、 http://danvega.org/blog/rss.cfm がhttp://danvega.org/blog/mobile/index.cfmにリダイレクト (302 一時的に移動) されています。

そのため、XML リーダーは Javascript を詰まらせています。私はそれがこの行だと思います:

            var postID = '';

このサーバー側を修正できない場合は、クライアントでいつでもスプーフィングできます。

def spoofedXmlGrab( URL url ) {
    url.openConnection().with { conn ->
        conn.setRequestProperty( 'User-Agent', 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2' )
        conn.inputStream.withReader { ins ->
            new XmlSlurper().parse( ins )
        }
    }
}

def xml = spoofedXmlGrab( 'http://danvega.org/blog/rss.cfm'.toURL() )
xml.channel.item.title.each {
  println it.text()
}
于 2013-09-02T15:38:21.190 に答える