[英]XML Parsing Android custom parser
I am trying to parse my XML in android, and i am facing some problems. 我正在尝试在android中解析我的XML,并且遇到了一些问题。
What i need from XML I need to get for each question 我需要从XML中获得的每个问题
question id
question text
options id
options text
This is my xml: 这是我的xml:
<question id="1" text="Zodiac Sign" >
<option id="1" >Aries</option>
<option id="2" >Taurus</option>
<option id="3" >Gemini</option>
<option id="4" >Cancer</option>
<option id="5" >Leo</option>
<option id="6" >Virgo</option>
<option id="7" >Libra</option>
<option id="8" >Scarpio</option>
<option id="9" >Sagitarius</option>
<option id="10" >Capricorn</option>
<option id="11" >Acqauarius</option>
</question><question id="2" text="Home Town" >
</question><question id="3" text="Current Locaion" >
</question><question id="4" text="Nationality" ></question>
<question id="5" text="Height" ></question>
<question id="6" text="Build(optional)" >
<option id="13" >Slim</option>
<option id="14" >Athletic</option>
<option id="15" >Few Pounds Extra</option>
<option id="16" >Obese</option>
</question><question id="7" text="Hair Color" >
</question><question id="8" text="Color Of Eyes" >
<option id="23" >Black</option>
<option id="24" >Brown</option>
<option id="25" >Blue</option>
</question><question id="9" text="Smoking Habits" >
</question>
And this is my code for parsing: 这是我的解析代码:
public class ProfileHome extends Activity {
public String id="";
public String text="";
public ArrayList<String>option = new ArrayList<String>();
public String singleoption="";
List<Questions> q;
private Questions question = new Questions();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.profile_home);
String payload = "<question id=\"1\" text=\"Zodiac Sign\" ><option id=\"1\" >Aries</option><option id=\"2\" >Taurus</option><option id=\"3\" >Gemini</option><option id=\"4\" >Cancer</option><option id=\"5\" >Leo</option><option id=\"6\" >Virgo</option><option id=\"7\" >Libra</option><option id=\"8\" >Scarpio</option><option id=\"9\" >Sagitarius</option><option id=\"10\" >Capricorn</option><option id=\"11\" >Acqauarius</option></question><question id=\"2\" text=\"Home Town\" ></question><question id=\"3\" text=\"Current Locaion\" ></question><question id=\"4\" text=\"Nationality\" ></question><question id=\"5\" text=\"Height\" ></question><question id=\"6\" text=\"Build(optional)\" ><option id=\"13\" >Slim</option><option id=\"14\" >Athletic</option><option id=\"15\" >Few Pounds Extra</option><option id=\"16\" >Obese</option></question><question id=\"7\" text=\"Hair Color\" ></question><question id=\"8\" text=\"Color Of Eyes\" ><option id=\"23\" >Black</option><option id=\"24\" >Brown</option><option id=\"25\" >Blue</option></question><question id=\"9\" text=\"Smoking Habits\" ></question>";
q = new ArrayList<Questions>();
if(payload.contains("question"))
{
for(int i=0;i<payload.length();i++)
{
Questions ques = new Questions();
// check if question has come
if(payload.substring(i, i+8).equals("question"))
{
i=i+9;
// check for the id, text and options
for(int k=i;k<payload.length();k++)
{
if(payload.substring(k, k+9).equals("/question"))
{
q.add(ques);
k=k+9;
break;
}else if(payload.substring(k, k+4).equals("id=\""))
{
//get id
for(int j=k+4;j<payload.length();j++)
{
if(payload.substring(j, j+1).equals("\""))
{
ques.setId(id);
id="";
k=j+1;
break;
}else
{
id= id + payload.substring(j, j+1);
}
}
//check for text
}else if(payload.substring(k, k+6).equals("text=\""))
{
for(int j=k+6;j<payload.length();j++)
{
if(payload.substring(j, j+1).equals("\""))
{
ques.setText(text);
id="";
k=j+1;
text="";
break;
}else
{
text= text + payload.substring(j, j+1);
}
}
//check for options
}else if(payload.substring(k, k+11).equals("option id=\""))
{
for(int l=k;l<payload.length();l++)
{
if(payload.substring(k, k+11).equals("</question>"))
{
ques.setOptions(option);
q.add(ques);
k=k+11;
break;
}
//now get all options and their id's
for(int j=k+11;j<payload.length();j++)
{
//get id and text
if(payload.substring(j, j+9).equals("</option>"))
{
option.add(singleoption);
singleoption="";
k=j+9;
break;
}else{
singleoption = singleoption +payload.substring(j,j+1);
}
}
}
}
}
}
}
}
for(int i=0;i<q.size();i++)
{
q.get(i).getText();
q.get(i).getId();
q.get(i).getOptions().toString();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.profile_home, menu);
return true;
}
}
The issue is: 问题是:
I am able to parse through complete xml but the issue is when i try to save question attributes in array list using 我能够解析完整的xml,但问题是当我尝试使用以下命令将问题属性保存在数组列表中时
q.add(question)
my previous entries are over write by new one . 我以前的条目已被新条目覆盖。
Is there any way through which i can parse this xml and get my desired data? 有什么方法可以解析此xml并获取所需的数据?
Use SimpleXML ( http://simple.sourceforge.net ). 使用SimpleXML( http://simple.sourceforge.net )。
private void doParse()
{
// static body here, but you can pass a Stream to the serializer too
private static final String XML_SAMPLE = "<questions><question id=\"1\" text=\"Zodiac Sign\" > <option id=\"1\" >Aries</option> <option id=\"2\" >Taurus</option> <option id=\"3\" >Gemini</option> <option id=\"4\" >Cancer</option> <option id=\"5\" >Leo</option> <option id=\"6\" >Virgo</option> <option id=\"7\" >Libra</option> <option id=\"8\" >Scarpio</option> <option id=\"9\" >Sagitarius</option> <option id=\"10\" >Capricorn</option> <option id=\"11\" >Acqauarius</option></question><question id=\"2\" text=\"Home Town\" ></question><question id=\"3\" text=\"Current Locaion\" ></question><question id=\"4\" text=\"Nationality\" ></question><question id=\"5\" text=\"Height\" ></question><question id=\"6\" text=\"Build(optional)\" > <option id=\"13\" >Slim</option> <option id=\"14\" >Athletic</option> <option id=\"15\" >Few Pounds Extra</option> <option id=\"16\" >Obese</option></question><question id=\"7\" text=\"Hair Color\" ></question><question id=\"8\" text=\"Color Of Eyes\" > <option id=\"23\" >Black</option> <option id=\"24\" >Brown</option> <option id=\"25\" >Blue</option></question><question id=\"9\" text=\"Smoking Habits\" ></question></questions>";
Serializer serializer = new Persister();
QuestionList response = null;
try {
response = serializer.read(QuestionList.class, XML_SAMPLE);
} catch (Exception e) {
e.printStackTrace();
}
// something interesting with the classes now
}
QuestionList.java : QuestionList.java :
package com.dshaw.questionparser;
import java.util.List;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Root;
@Root(name="questions")
public class QuestionList {
@ElementList(name="question",inline=true)
List<Question> questions;
}
Question.java: Question.java:
package com.dshaw.questionparser;
import java.util.Map;
import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.ElementMap;
import org.simpleframework.xml.Root;
@Root(name="question")
public class Question {
@Attribute(required=false)
Integer id;
@Attribute(required=false)
String text;
@ElementMap(entry="option", key="id", attribute=true, inline=true, required=false)
private Map<String, String> options;
}
And finally, the output in the debugger so you can see how it parses: 最后,调试器中的输出,以便您可以看到其解析方式:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.