java - 简化代码以加载 XML 文件的建议?

标签 java android xml refactoring

我终于完成了我的 XML 解析代码,现在看着它,它吓到我了。此代码适用于简单的基于 Android 的文字冒险游戏。

我将所有关于遭遇、地点和角色的数据存储在“res”文件夹中的 XML 文件中。

我编写了这个 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>

最佳答案

在处理具有直接对象映射的 XML 时,就像您的情况一样,我通常倾向于使用编码技术。现在最标准的是JAXB。然而,它会为您的应用程序增加相当多的开销(大约 9 兆),这在移动应用程序中是不可忽略的。在这种情况下,一个更轻量级的编码 API,例如 simple , 可以有一个利基市场。

关于java - 简化代码以加载 XML 文件的建议?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8591803/

相关文章:

java - 如何在调试器中访问页面的 Selenium WebDriver (DOM) 表示?

java - 如何在 Android NDK 中通过 JNI 调用 C 函数以 Java 字符串形式返回数据

java - ParadiseInfo2 变量错误代码

java - 如何使用 OpenIMAJ 识别新面孔

xml - XSLT 去规范化/透视/展平 xml 文件?第2部分

android - 在android中添加有和没有资源的库

android - 是否可以在 TextView 中插入文本?

android - 控制 VirtualDisplay 的帧率

c# - 在 xml 文件中查找值的最有效方法?

ruby-on-rails - Rails 使用正在运行的构建器编写 xml