2011-12-21 13 views
1

私は最終的に私のXML解析コードを完成させました、そして今それを見て、それは私を恐れる。このコードは、単純なAndroidベースのテキストアドベンチャーゲーム用です。XMLファイルを読み込むためのコードを簡略化するためのアドバイスはありますか?

XMLファイルに格納されている出会い、場所、文字に関するすべてのデータが「res」フォルダにあります。

このXMLパーサーをXMLファイルを介してコーディングし、データをEncounterというクラスに格納しました。 Encounter内のデータにコード内のどこにでもアクセスできます。

だから私はOOPの部分を落としたと思います。しかし、実際の解析は面倒です。

XMLデータの解析については、より良い方法がありますか?ここで

が私のコードです:

public class XmlParser extends Activity { 

private String xmlValue; 
private int encounterID; 
Encounter encounter; 

public XmlParser() 
    throws XmlPullParserException, IOException 
{ 
    XmlPullParser xpp = getResources().getXml(R.xml.encounters); 

    int eventType = xpp.getEventType(); 
    while (eventType != XmlPullParser.END_DOCUMENT) { 
    String elName = xpp.getName(); 
    if(eventType == XmlPullParser.START_TAG) {  //creature 
     eventType = xpp.next(); 

     //top level nodes 
     if(xpp.getName().equalsIgnoreCase("identity")){ 
      eventType = xpp.next(); 
      if(elName.equalsIgnoreCase("name")) { 
       encounter.name = xpp.getText(); 
      } else if(elName.equalsIgnoreCase("race")) { 
       encounter.race = xpp.getText(); 
      } else if(elName.equalsIgnoreCase("gender")) { 
       encounter.gender = xpp.getText(); 
      } else if(elName.equalsIgnoreCase("alignment")) { 
       encounter.alignment = xpp.getText(); 
      } else if(elName.equalsIgnoreCase("age")) { 
       try { 
        encounter.age = Integer.parseInt(xpp.getText()); 
       } catch (NumberFormatException e) { 
        //ok 
       } 
      } 
     } else if (xpp.getName().equalsIgnoreCase("appearance")) { 
      eventType = xpp.next(); 
      if(elName.equalsIgnoreCase("condition")){ 
       encounter.condition = xpp.getText(); 
      } else if(elName.equalsIgnoreCase("skinColor")) { 
       encounter.skinColor = xpp.getText(); 
      } else if(elName.equalsIgnoreCase("hairColor")) { 
       encounter.hairColor = xpp.getText(); 
      } else if(elName.equalsIgnoreCase("size")) { 
       encounter.size = xpp.getText(); 
      } else if(elName.equalsIgnoreCase("height")) { 
       encounter.height = xpp.getText(); 
      } else if(elName.equalsIgnoreCase("weight")) { 
       encounter.weight = xpp.getText(); 
      } 

     } else if (xpp.getName().equalsIgnoreCase("stats")) { 
      eventType = xpp.next(); 
      if(elName.equalsIgnoreCase("hitPoints")) { 
       try { 
        encounter.HP = Integer.parseInt(xpp.getText()); 
       } catch (NumberFormatException e) { 
        //ok 
       } 
      } else if(elName.equalsIgnoreCase("armorClass")) { 
       try { 
        encounter.AC = Integer.parseInt(xpp.getText()); 
       } catch (NumberFormatException e) { 
        //ok 
       }     
      } else if(elName.equalsIgnoreCase("actionPoints")) { 
       try { 
        encounter.AP = Integer.parseInt(xpp.getText()); 
       } catch (NumberFormatException e) { 
        //ok 
       }     
      } else if(elName.equalsIgnoreCase("magicPoint")) { 
       try { 
        encounter.AP = Integer.parseInt(xpp.getText()); 
       } catch (NumberFormatException e) { 
        //ok 
       }     
      } else if(elName.equalsIgnoreCase("strength")) { 
       try { 
        encounter.strength = Integer.parseInt(xpp.getText()); 
       } catch (NumberFormatException e) { 
        //ok 
       }     
      } else if(elName.equalsIgnoreCase("dexterity")) { 
       try { 
        encounter.dexterity = Integer.parseInt(xpp.getText()); 
       } catch (NumberFormatException e) { 
        //ok 
       } 
      } else if(elName.equalsIgnoreCase("intelligence")) { 
       try { 
        encounter.intelligence = Integer.parseInt(xpp.getText()); 
       } catch (NumberFormatException e) { 
        //ok 
       } 
      } 

     } else if (xpp.getName().equalsIgnoreCase("inventory")) { 
      eventType = xpp.next(); 
      if(elName.equalsIgnoreCase("weapon")) { 
       encounter.weapon = xpp.getText(); 
      } else if(elName.equalsIgnoreCase("armor")) { 
       encounter.armor = xpp.getText(); 
      } else if(elName.equalsIgnoreCase("magicItem")) { 
       encounter.magicItem = xpp.getText(); 
      } 

     } else if (xpp.getName().equalsIgnoreCase("magic")) { 
      eventType = xpp.next(); 
      if(elName.equalsIgnoreCase("attackSpell")) { 
       encounter.attackSpell = xpp.getText(); 
      } else if(elName.equalsIgnoreCase("defenseSpell")) { 
       encounter.defenseSpell = xpp.getText(); 
      } 
     } else if (xpp.getName().equalsIgnoreCase("treasureItems")) { 
      eventType = xpp.next(); 
      if(elName.equalsIgnoreCase("item1")) { 
       encounter.item1 = xpp.getText(); 
      } else if(elName.equalsIgnoreCase("item2")) { 
       encounter.item2 = xpp.getText(); 
      } 
     } 
    } else if(eventType == XmlPullParser.END_TAG) { 
     //System.out.println("End tag "+xpp.getName()); 
    } 
    eventType = xpp.next(); 
    } 
    //System.out.println("End document"); 
} 

誰もが興味を持っている場合は、ここでの出会いのための私のXMLファイルです:

<?xml version="1.0" encoding="UTF-8"?> 
<encounters> 
<creature id="1" type="monster"> 
    <identity> 
     <name></name> 
     <race></race> 
     <gender></gender> 
     <age></age> 
     <alignment></alignment> 
    </identity> 

    <appearance> 
     <condition></condition> 
     <skinColor></skinColor> 
     <hairColor></hairColor> 
     <size></size> 
     <height></height> 
     <weight></weight> 
    </appearance> 

    <stats> 
     <hitPoints></hitPoints> 
     <armorClass></armorClass> 
     <actionPoints></actionPoints> 
     <magicPoints></magicPoints> 
     <strength></strength> 
     <dexterity></dexterity> 
     <intelligence></intelligence> 
    </stats> 

    <inventory> 
     <weapon></weapon> 
     <armor></armor> 
     <magicItem></magicItem> 
    </inventory> 

    <magic> 
     <attackSpell></attackSpell> 
     <defenseSpell></defenseSpell> 
    </magic> 

    <treasureItems> 
     <item1></item1> 
     <item2></item2> 
    </treasureItems> 

</creature> 

+4

コードの複雑さを軽減するための提案ではありませんが、あなたが投げた例外を使用せずにたくさんのtry/catchブロックを使用しています。コードのその部分で何かがうまくいかなければ、それは間違っていることさえ知りません。スタックトレースを出力するだけであっても、実際にそれらの例外を使用することをお勧めします。 –

答えて

3

あなたはVTD-XMLをチェックアウトすることができ、軽量ライブラリアンドロイドで優れている (より大きいが、それはファイルサイズではるかに大きい)。
アンドロイドに付属するSAX-parserもあります。

それ以外は、XmlPullParserを使用すると、通常はキーと整数としてtagnamesのマップがありますが、マップから値を取得してシンプルなスイッチを使用してコードをクリアしますビット:

//Before parsing, or if used frequently the map can be put outside the method and reused: 
final HashMap<String, Integer> tags = new HashMap<String, Integer>(9, 1); 
tags.put("encounters", 0); 
tags.put("identity", 1); 
tags.put("name", 2); 
//And so on... 

//in your parse-loop: 
int tag = tags.get(xpp.getName()); 
switch(tag){ 
case 0: //Handle encounter tag... 
break; 
case 1: //Handle identity tag... 
break; 
case 2: //Handle name tag... 
break; 
//For all tags. 
} 
+0

ご意見ありがとうございます。私はSAXが主にURL経由でアクセスされたXML文書のためだと考えました。私のXML文書は電話の「res」フォルダにあります。 – SkyeBoniwell

+1

VTDXMLやXmlPullParserが自分のニーズに合っていることがわかっているので、歓迎です。 – Jave

+0

こんにちはJave - "タッグネームをキーとしてマップする"とはどういう意味ですか? ---ありがとう – SkyeBoniwell

4

あなたの場合のように、直接オブジェクトマッピングを持つXMLを扱う場合、私は通常マーシャリング技術を使用する傾向があります。最近のJAXBの標準規格はJAXBです。しかし、アプリケーションにかなりのオーバーヘッド(aprox 9メガ)を追加します。これはモバイルアプリケーションでは無視できません。この場合、simpleなどのより軽量なマーシャリングAPIは、ニッチを持つことができます。

関連する問題