2

XML を解析して ListView に表示するアプリを作成しています。XML のいくつかの項目に&s が含まれているため、このようにエスケープし&ました。いくつかのデバイスとエミュレーターで正しく動作しています。

しかし、2 つのデバイス (Samsung Sidekick 4g API 2.2 と Samsung Replish API 2.3.6) では失敗します。取得後のすべて&が魔法のように消えます。

問題を引き起こしている XML の項目は次のとおりです。

<site>
    <name>English Language &amp; Usage</name>
    <link>http://english.stackexchange.com/</link>
    <about>English Language &amp; Usage Stack Exchange is a question and answer site for linguists, etymologists, and serious English language enthusiasts.</about>
    <image>https://dl.dropboxusercontent.com/u/5724095/XmlParseExample/english.png</image>
</site>

解析コードの「要点」は次のとおりです。

private static String getValue(Element item, String str) {
    NodeList n = item.getElementsByTagName(str);
    Log.i("StackSites", ""+getElementValue(n.item(0)));
    return getElementValue(n.item(0));
}

private static String getElementValue( Node elem ) {
         Node child;
         if( elem != null){
             if (elem.hasChildNodes()){
                 for( child = elem.getFirstChild(); child != null; child = child.getNextSibling() ){
                     if( child.getNodeType() == Node.TEXT_NODE  ){
                         return child.getNodeValue();
                     }
                 }
             }
         }
         return "";
  }

一部のデバイス (LG Optimus G、Moto Attrix 2、およびいくつかのエミュレーター) では、これは正しく機能し、次のようになります。

ここに画像の説明を入力

ただし、私が試した2つのSamsungデバイスではgetValue()、メソッドはの前にあるテキストのみを返す&amp;ため、結果は次のようになります:

ここに画像の説明を入力

4

3 に答える 3

3

これは、残りのノードを見ていないためです。エンティティは別のノードを取得し、エンティティに続くテキストはその後のノードを取得します。すぐに戻ってきます。結果を連結する必要があります。

于 2013-04-21T21:57:41.513 に答える
3

これは、一部の Android リリースの既知のバグです。Honeycomb (3.0) で修正されました。

良い回避策はありません。テキストを として処理し[text node] [entity node] [text node]、エンティティ参照を自分で解釈し、結果を連結する必要があります。

または、XML 文字参照の使用を避けて、独自のエスケープ シーケンスを置き換えることもできます。パーサーが を認識しない限り&、問題は回避されます。

于 2013-04-21T22:05:30.930 に答える