在android中解析xml
我正在编写一个Android问答应用程序。我想从XML文件中加载问题,将它们放入字符串中,然后将这些字符串用作按钮文本 我在XML解析方面遇到了问题。我使用在android中解析xml,android,xml-parsing,Android,Xml Parsing,我正在编写一个Android问答应用程序。我想从XML文件中加载问题,将它们放入字符串中,然后将这些字符串用作按钮文本 我在XML解析方面遇到了问题。我使用XmlPullParserFactory和XmlPullParser。 我甚至尝试过XMLResourceParser,但没有成功。我怎样才能正确地做到这一点 这是OnCreate中的初始化: XmlPullParserFactory pullParserFactory; try { pullParserFactory
XmlPullParserFactory
和XmlPullParser
。
我甚至尝试过XMLResourceParser
,但没有成功。我怎样才能正确地做到这一点
这是OnCreate中的初始化:
XmlPullParserFactory pullParserFactory;
try {
pullParserFactory = XmlPullParserFactory.newInstance();
XmlPullParser parser = pullParserFactory.newPullParser();
InputStream in_s = getApplicationContext().getAssets().open("new_anwers.xml");
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(in_s, null);
loadAnswers(parser);
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
以下是函数和帮助器类:
void loadAnswers(XmlPullParser parser) throws XmlPullParserException,IOException
{
ArrayList<Answer> answers = null;
int eventType = parser.getEventType();
Answer currAnswer = null;
while (eventType != XmlPullParser.END_DOCUMENT) {
String name = null;
switch(eventType){
case XmlPullParser.START_DOCUMENT:
answers = new ArrayList();
break;
case XmlPullParser.START_TAG:
name = parser.getName();
if(name == "answer1") {
currAnswer = new Answer();
} else if (currAnswer != null) {
if(name == "text1") {
currAnswer.text1 = parser.nextText();
} else if(name == "text2") {
currAnswer.text2 = parser.nextText();
} else if(name == "text3") {
currAnswer.text3 = parser.nextText();
} else if(name == "text4") {
currAnswer.text4 = parser.nextText();
}
}
break;
case XmlPullParser.END_TAG:
name = parser.getName();
if (name.equalsIgnoreCase("answer1") && currAnswer!= null){
answers.add(currAnswer);
}
}
eventType = parser.next();
}
setBtnTxt(answers);
}
class Answer {
String text1;
String text2;
String text3;
String text4;
}
void setBtnTxt(ArrayList<Answer> answers) {
String[] txt = new String[4];
Iterator<Answer> it = answers.iterator();
while(it.hasNext())
{
Answer currAnswer = it.next();
txt[1] = currAnswer.text1;
txt[2] = currAnswer.text2;
txt[3] = currAnswer.text3;
txt[4] = currAnswer.text4;
}
Button odgA = (Button) findViewById(R.id.button_OdgA);
Button odgB = (Button) findViewById(R.id.button_OdgB);
Button odgC = (Button) findViewById(R.id.button_OdgC);
Button odgD = (Button) findViewById(R.id.button_OdgD);
odgA.setText(txt[1]);
odgB.setText(txt[2]);
odgC.setText(txt[3]);
odgD.setText(txt[4]);
}
void loadAnswers(XmlPullParser解析器)抛出XmlPullParserException、IOException
{
ArrayList answers=null;
int eventType=parser.getEventType();
答案currAnswer=null;
while(eventType!=XmlPullParser.END_文档){
字符串名称=null;
开关(事件类型){
案例XmlPullParser.START_文档:
answers=newarraylist();
打破
case XmlPullParser.START_标记:
name=parser.getName();
如果(名称=“回答1”){
currAnswer=新答案();
}else if(currAnswer!=null){
如果(名称=“文本1”){
currAnswer.text1=parser.nextText();
}else if(名称==“text2”){
currAnswer.text2=parser.nextText();
}else if(名称==“text3”){
currAnswer.text3=parser.nextText();
}else if(名称==“text4”){
currAnswer.text4=parser.nextText();
}
}
打破
case XmlPullParser.END_标记:
name=parser.getName();
if(name.equalsIgnoreCase(“answer1”)&currAnswer!=null){
答案。添加(当前答案);
}
}
eventType=parser.next();
}
(答案);
}
课堂答案{
字符串text1;
字符串text2;
字符串text3;
字符串text4;
}
void setBtnTxt(数组列表答案){
字符串[]txt=新字符串[4];
Iterator it=answers.Iterator();
while(it.hasNext())
{
答案=it.next();
txt[1]=currAnswer.text1;
txt[2]=currAnswer.text2;
txt[3]=currAnswer.text3;
txt[4]=currAnswer.text4;
}
按钮odgA=(按钮)findViewById(R.id.Button\u odgA);
按钮odgB=(按钮)findViewById(R.id.Button\u odgB);
按钮odgC=(按钮)findViewById(R.id.Button\u odgC);
按钮odgD=(按钮)findViewById(R.id.Button\u odgD);
odgA.setText(txt[1]);
odgB.setText(txt[2]);
odgC.setText(txt[3]);
odgD.setText(txt[4]);
}
以下是答案:
<?xml version="1.0" encoding="UTF-8"?>
<new_answers>
<answer1>
<text1>Zvonimir</text1>
<text2>Tomislav</text2>
<text3>Branimir</text3>
<text4>Viseslav</text4>
</answer1>
<answer2>
<text1>Stipe Mesic</text1>
<text2>Ivo Josipovic</text2>
<text3>Franjo Tuđman</text3>
<text4>Mate Granic</text4>
</answer2>
<answer3>
<text1>Hrvatski politicar</text1>
<text2>Hrvatski akademik</text2>
<text3>Hrvatski glazbenik</text3>
<text4>Hrvatski branitelj</text4>
</answer3>
</new_answers>
兹沃尼米尔
托米斯拉夫
布拉尼米尔
维塞斯拉夫
梅西奇
约西波维奇
弗兰乔·图曼
配偶颗粒
赫瓦茨基政治
赫瓦茨基·阿卡德米克
赫瓦茨基-格拉兹比尼克
赫瓦茨基·布拉尼泰尔
我如何才能正确完成此任务?
这与XML解析问题没有直接关系,但如果您可以将答案XML转换为字符串数组格式并将其放入res/values/arrays.XML
中,就可以省去解析XML的麻烦。在代码中,您可以使用R.array来访问它们。
比如说,
<answer1>
<text1>Zvonimir</text1>
<text2>Tomislav</text2>
<text3>Branimir</text3>
<text4>Viseslav</text4>
</answer1>
因为有许多数组,所以可以定义一个int数组来保存对所有数组的引用
public static final int[] ALL_ANSWERS = {
R.array.answer_1,
R.array.answer_2,
R.array.answer_3,
R.array.answer_4,
R.array.answer_5}
在代码中,您可以简单地从
String[] options = getResources().getStringArray(ALL_ANSWERS[index]);
但是,如果您是从其他地方下载XML,这将不起作用。只有当您的所有答案都打包在应用程序中时,这才有效。此外,一般经验法则是,不要直接在onCreate()方法中进行XML处理,因为它将在UI线程上执行,并且会使您的应用程序对用户无响应。相反,在AsyncTask中执行它,因为它将在单独的线程中执行处理。@Sundeep在这种情况下,我将把问题的文本放在哪里?@petko_stankoski您可以将其放在单独的数组中,也可以将其作为同一数组中的第一个元素。我更喜欢前者,因为它使我的问题和选项分开,这样我可以使用[Collections.shuffle()]轻松地混淆选项(当我加载它们时。但是,您需要维护顺序-即,如果您删除一个问题,您必须找到相应的选项并将其删除。在第二种情况下,删除整个数组就足够了。
public static final int[] ALL_ANSWERS = {
R.array.answer_1,
R.array.answer_2,
R.array.answer_3,
R.array.answer_4,
R.array.answer_5}
String[] options = getResources().getStringArray(ALL_ANSWERS[index]);