嗨,我很难搞清楚要做我的XML文件阅读。
我使用Sax但我似乎无法让SAX读取“ansArray”的子节点。我不确定我的XML是否格式错误,任何帮助都会很棒。
NB 使用XStream保存了XML Doc,这就是为什么“AnsArray”有4个字符串项。
XML DOC:
<?xml version="1.0" encoding="utf-8" ?>
<questionList>
<Question>
<id>-1</id>
<question>"Who Was Sleepless In Seattle With Meg Ryan?"</question>
<ansArray>
<string>"Bruce Willis"</string>
<string>"Arnie Schwarzenegger"</string>
<string>"Joe Pesci"</string>
<string>"Tom Hanks"</string>
</ansArray>
<correctAns>4</correctAns>
<iDifficulty>2</iDifficulty>
</Question>
<Question>
<id>-1</id>
<question>"who was the Terminator?"</question>
<ansArray>
<string>"John Travolta"</string>
<string>"Stevan Segal"</string>
<string>"Arnie Schwarzenegger"</string>
<string>"Al Pacino"</string>
</ansArray>
<correctAns>3</correctAns>
<iDifficulty>3</iDifficulty>
</Question>
</questionList>
在上面的XML文件中,我可以阅读除ansArray的孩子之外的所有内容,即
<ansArray>
<string>"John Travolta"</string>
<string>"Stevan Segal"</string>
<string>"Arnie Schwarzenegger"</string>
<string>"Al Pacino"</string>
</ansArray>
SAX XML代码:
import java.util.ArrayList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAX_XMLReader extends DefaultHandler {
boolean currentElement = false;
String currentValue = "";
static Question question;
static ArrayList<Question> questionList=new ArrayList<Question>();
ArrayList<String> sAnswers=new ArrayList<String>(4);
public static ArrayList<Question> getquestionList() {
return questionList;
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes atts) throws SAXException {
currentElement = true;
//System.out.println("qName = "+qName );
if (qName.equals("questionList")) {
questionList = new ArrayList<Question>();
} else if (qName.equals("Question")) {
question = new Question();
} //how to handle the answer string array
else if (qName.equalsIgnoreCase("ansArray")) {
//??
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
currentElement = false;
//System.out.println("qName = "+qName );
if(qName.equals("question"))
{
question.setQuestion(currentValue.trim());
//System.out.println("Q: "+currentValue.trim());
}
else if (qName.equalsIgnoreCase("correctAns")) {
question.setCorrectAns(Integer.parseInt(currentValue.trim()));
}
else if (qName.equalsIgnoreCase("iDifficulty")) {
question.setiDifficulty(Integer.parseInt(currentValue.trim()));
}
else if (qName.equalsIgnoreCase("ansArray")) {
//??
}
else if (qName.equals("Question")) {
questionList.add(question);
}
currentValue = "";
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if (currentElement) {
currentValue = currentValue + new String(ch, start, length);
}
}
}
问题类:
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
//change string array to list
public class Question implements Serializable{
private int id=-1;
private String question="";
//private String[] ansArray = new String[4];
ArrayList<String> sAnswers=new ArrayList<String>(4);
private int correctAns=-1;
private int iDifficulty=-1;
public Question(){
//sAnswers=new ArrayList<String>();
for(int x=0;x<4;x++){
sAnswers.add("default answer "+x);
}
}
//testing contructor
public Question(int id,String sQuestion){
this.id=id;
this.question =sQuestion;
}
public Question(int id,String sQuestion,String sAns1){
this.id=id;
this.question =sQuestion;
this.sAnswers.add(sAns1);
//this.ansArray[0]=sAns1;
}
public Question(String sQuestion,String sAns1,String sAns2,String sAns3,String sAns4,int iCorrectAns){
this.question =sQuestion;
this.sAnswers.add(sAns1);
this.sAnswers.add(sAns2);
this.sAnswers.add(sAns3);
this.sAnswers.add(sAns4);
this.correctAns =iCorrectAns;
}
//constuctor with difficuly int(1-15)
public Question(String sQuestion,String sAns1,String sAns2,String sAns3,String sAns4,int iCorrectAns,int iDifficulty){
this.question =sQuestion;
this.sAnswers.add(sAns1);
this.sAnswers.add(sAns2);
this.sAnswers.add(sAns3);
this.sAnswers.add(sAns4);
this.correctAns =iCorrectAns;
this.iDifficulty=iDifficulty;
}
//constuctor with difficuly int(1-15)
public Question(int id,String sQuestion,String sAns1,String sAns2,String sAns3,String sAns4,int iCorrectAns,int iDifficulty){
this.id=id;
this.question =sQuestion;
this.sAnswers.add(sAns1);
this.sAnswers.add(sAns2);
this.sAnswers.add(sAns3);
this.sAnswers.add(sAns4);
this.correctAns =iCorrectAns;
this.iDifficulty=iDifficulty;
}
public int getiDifficulty() {
return iDifficulty;
}
public void setiDifficulty(int iDifficulty) {
this.iDifficulty = iDifficulty;
}
public int getID() {
return id;
}
public void setID(int id) {
this.id = id;
}
public String getQuestion() {
return question;
}
public void setQuestion(String question) {
this.question = question;
}
public String getAnswer(int i){
return sAnswers.get(i);
}
public void setAnswer(int i,String answer){
sAnswers.add(answer);
}
//get the correct answer as a string
public String sGetCorrectAnswer(){
return sAnswers.get(correctAns);
}
public String getAnswersList()
{
String s="\nA) " + sAnswers.get(0) +
"\nB) " + sAnswers.get(1) +
"\nC) " + sAnswers.get(2) +
"\nD) " + sAnswers.get(3);
return s;
}
public int getiCorrectAns() {
return correctAns;
}
public void setCorrectAns(int correctAns) {
this.correctAns = correctAns;
}
@Override
public String toString(){
String log ="\n\nQuestion by ID" +
"\n\nId: "+this.getID()+
"\nQuestion: " + this.getQuestion() +
" \nAns1: " + this.getAnswer(0) +
" \nAns2: " + this.getAnswer(1) +
" \nAns3: " + this.getAnswer(2) +
" \nAns4: " + this.getAnswer(3) +
" \nCorrectAns: " + this.getiCorrectAns()+
" \nDifficulty: " + this.getiDifficulty()
;
return log;
}
}
答案 0 :(得分:2)
startElement()
。这意味着它适用于您的示例中的以下元素(qname):
这意味着您必须自己管理xml-data中的位置(级别,元素树)。