2

SAXパーサーを使用してXMLを解析しているAndroidアプリケーションを作成しています。

XMLには次のタグがあります。

<title>Deals &amp; Dealmakers: Technology, media and communications M&amp;A </title>

ご覧のとおり、次のような特別なチャーターが含まれています&amp;

問題は、SAXの暗黙的な方法を使用していることです。

@Override
public void characters(char[] ch, int start, int length) throws SAXException{}

ここで、パラメータ'char [] ch'は行全体をフェッチすることになっていますDeals &amp; Dealmakers: Technology, media and communications M&amp;A が、「Deals」のみを取得しています。

この問題を解決するにはどうすればよいですか?

1つの問題は、XMLをSAXパーサーに渡す方法が原因である可能性があります。エンコーディングやフォーマットを変更する必要がありますか?

InputStream現在、以下のコードを使用してXMLを渡しています。

HttpResponse httpResponse = utils.sendRequestAndGetHTTPResponse(URL);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
    HttpEntity entity = httpResponse.getEntity();
    InputStream in = entity.getContent();
    parseResponse(in);
}


// Inside parseResponse method:
try {
    SAXParserFactory spf = SAXParserFactory.newInstance();
    SAXParser sp = spf.newSAXParser();
    XMLReader xmlReader = sp.getXMLReader();

    MyHandler handler = new MyHandler();
    xmlReader.setContentHandler(handler);
    xmlReader.parse(new InputSource(in));
} catch (Exception e) {
}
4

2 に答える 2

6

ここで、パラメータ'char [] ch'は、Deals&Dealmakers:Technology、Media、Communications M&Aの全行をフェッチすることになっていますが、「Deals」しか取得していません。

1回の呼び出しでテキスト全体を取得できると想定しているようです。その保証はありません。characters私はあなたのメソッドが同じテキストノードに対して複数回呼び出されることを強く疑っています。これはパーサーが行うのに有効です。コードがそれを処理することを確認する必要があります。

ドキュメントから:

SAXパーサーは、連続するすべての文字データを1つのチャンクで返す場合もあれば、複数のチャンクに分割する場合もあります。ただし、ロケーターが有用な情報を提供できるように、単一のイベントのすべての文字は同じ外部エンティティからのものである必要があります。

すべてのデータを一度に取得できるように設定できる機能がある場合があります。わからない。

于 2013-01-12T11:54:27.107 に答える
0

UTF-8がまさに問題だと思います。このファイルでは、エンコーディングの解析はISO-8859-1として定義されています

したがって、次のコードを試してください。

InputSource is = new InputSource(yourInputStream);
is.setEncoding("ISO-8859-1");
xmlReader.parse(is);

お役に立てれば。

于 2013-01-12T12:08:00.743 に答える