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