我正在为Android平台创建一个简单的琐事游戏。 (对于它的价值,我是一个爱好者,只有在我能够开辟空闲时间时才有时间编码。因此,我的问题 - 就像我的技能组合 - 非常基本。)
如果我在QuestionActivity页面上对所有问题进行硬编码,我的游戏就可以运行,但从长远来看,这显然不是一个好方法。
我创建了一个包含以下属性的Question对象:String question,String [] answers,int correctPointer,String pithyComment。每个问题对象只有4个可能的答案。在QuestionActivity页面上,我创建了一个包含多个Question对象的questionArray。我可以在数组中随机播放项目,我可以在它们显示给用户之前随机播放可能的答案,并且所有错误检查都可以正常工作。
我还创建了一个包含50多个问题的XML文件。我想在游戏初始化时将此文件的内容加载到QuestionBank的Question对象数组中。过去几天我一直在研究这个问题,我无法找到前进的最佳方法。在Android / Java中解析XML似乎比过去在其他编程语言中更复杂。每个XML解析教程似乎最终都需要创建多个类才能处理这个非常简单的数据结构。我想知道是否有一些非常明显的东西,更多的是“烘烤”,我根本就没有看到。
我的问题是:我应该使用SAX,STAX或DOM解析器解析XML文件。或者,考虑到这个游戏永远不会超过500个问题,我应该考虑使用SQL Lite吗?或者有更好的方法吗?
我不需要写入XML,除了将一个标记的内容传递到适当的变量之外,我不需要进行任何花哨的解析。可能与解析相关的唯一棘手的事情是每个问题有四个可能的答案。我有两个版本的XML文件:一个是每个答案与其他项目(question,correctPointer)存在于同一级别,另一个是包含名为answerList的父标记的四个答案。此时,由于总是四个答案并且它们总是以相同的顺序出现,我倾向于只是将所有四个答案编码在与XML中的其他项目相同的级别,然后手动推送当我把它们读入QuestionBank时,它们变成了一个数组。
感谢。
答案 0 :(得分:1)
将其存储为数据库肯定是一种选择,也许可以根据您提出的问题数量来选择。
我建议使用JSON。 JSON解析内置于Android中,也是大多数数据在REST API中传递的方式。
这是一个很好的教程:http://www.androidhive.info/2012/01/android-json-parsing-tutorial/
你的问题结构看起来像这样:
{
"question": "Sample Question",
"answers": [ "A", "B", "C", "D" ],
"correctPointer" 2,
"pithyComment": "Not sure what a pithy comment is."
}
另一个相当详细的例子:How to parse JSON in Android
答案 1 :(得分:0)
这是一个很好的tutorial on DOM Parser。它很简单,不太冗长,你不需要创建多个类来使用它。
例如(来自教程):
<?xml version="1.0"?>
<company>
<staff id="1001">
<firstname>yong</firstname>
<lastname>mook kim</lastname>
<nickname>mkyong</nickname>
<salary>100000</salary>
</staff>
<staff id="2001">
<firstname>low</firstname>
<lastname>yin fong</lastname>
<nickname>fong fong</nickname>
<salary>200000</salary>
</staff>
</company>
如何使用解析器:
try {
File fXmlFile = new File("/Users/mkyong/staff.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
//optional, but recommended
//read this - http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work
doc.getDocumentElement().normalize();
System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
NodeList nList = doc.getElementsByTagName("staff");
System.out.println("----------------------------");
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
System.out.println("\nCurrent Element :" + nNode.getNodeName());
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
System.out.println("Staff id : " + eElement.getAttribute("id"));
System.out.println("First Name : " + eElement.getElementsByTagName("firstname").item(0).getTextContent());
System.out.println("Last Name : " + eElement.getElementsByTagName("lastname").item(0).getTextContent());
System.out.println("Nick Name : " + eElement.getElementsByTagName("nickname").item(0).getTextContent());
System.out.println("Salary : " + eElement.getElementsByTagName("salary").item(0).getTextContent());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}