2

Web から取得した XML ファイルを解析するために SAX を使用しています。次のようなコードでDefaultHandlerを拡張しました。

public class ArrivalHandler extends DefaultHandler {    
    @Override
    public void startElement(String namespaceUri, String localName, String qualifiedName, Attributes attributes) throws SAXException {
        if (qualifiedName.equalsIgnoreCase("resultSet")) {
            System.out.println("got a resultset");
        } else if (qualifiedName.equalsIgnoreCase("location")) {
            System.out.println("got a location");
        } else if (qualifiedName.equalsIgnoreCase("arrival")) {
            System.out.println("got an arrival");
        } else {
            System.out.println("There was an unknown XML element encountered: '" + qualifiedName + "'");
        }        
    }

    @Override
    public void endElement(String namespaceUri, String localName, String qualifiedName) throws SAXException {
        // we'll just ignore this for now
    }

    @Override
    public void characters(char[] chars, int startIndex, int length) throws SAXException {
        // ignore this too
    }
}

私が抱えている問題は、一連の空の要素を取得していることです。ログには次のように書かれています。

There was an unknown XML element encountered: ''
There was an unknown XML element encountered: ''
There was an unknown XML element encountered: ''
etc

これは、ローカル ファイルを渡すだけのときはうまくいきましたparser.parseが、今では次のように Web から取得しています。

HttpClient httpClient = new DefaultHttpClient();
resp = httpClient.execute("http://example.com/whatever");

SAXParserFactory saxFactory = SAXParserFactory.newInstance();
ArrivalHandler handler = new ArrivalHandler();
SAXParser parser = saxFactory.newSAXParser();
parser.parse(resp.getEntity().getContent(), handler);

上記の(明らかに)空の結果が得られます。

私がこれまでに調べたこと:

  1. InputStreamfromを文字列に変換してresp.getEntity().getContent()ダンプしたところ、サーバーから XML を正しく取得しているように見えます。
  2. スローされる例外はありませんが、" W/ExpatReader(232): DTD handlers aren't supported." という警告が表示されます。

私が間違ってやっていること、またはこれをデバッグする方法についての他のアイデアはありますか?

4

1 に答える 1

3

ドキュメントからContentHandler.startElement

namespace-prefixes プロパティが true の場合は修飾名が必要であり、namespace-prefixes プロパティが false (デフォルト) の場合はオプションです。

では、namespace-prefixes プロパティを に設定していtrueますか?

代わりに uri と localName だけで対処できますか?

于 2009-12-23T19:15:57.673 に答える