在android中解析xml

在android中解析xml,android,xml-parsing,Android,Xml Parsing,我正在编写一个Android问答应用程序。我想从XML文件中加载问题,将它们放入字符串中,然后将这些字符串用作按钮文本 我在XML解析方面遇到了问题。我使用XmlPullParserFactory和XmlPullParser。 我甚至尝试过XMLResourceParser,但没有成功。我怎样才能正确地做到这一点 这是OnCreate中的初始化: XmlPullParserFactory pullParserFactory; try { pullParserFactory

我正在编写一个Android问答应用程序。我想从XML文件中加载问题,将它们放入字符串中,然后将这些字符串用作按钮文本

我在XML解析方面遇到了问题。我使用
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]);