gpt4 book ai didi

java - 使用 SAX 解析 XML

转载 作者:行者123 更新时间:2023-12-02 06:16:59 28 4
gpt4 key购买 nike

嗨,我无法弄清楚如何读取我的 XML 文件。

我正在使用 Sax,但我似乎无法让 SAX 读取“ansArray”的子节点。我不确定我的 XML 格式是否错误,任何帮助都会很棒。

注意XML 文档是通过使用 XStream 保存的,这就是为什么“AnsArray”有 4 个字符串项。

XML 文档:

<?xml version="1.0" encoding="utf-8" ?>
<questionList>
<Question>
<id>-1</id>
<question>&quot;Who Was Sleepless In Seattle With Meg Ryan?&quot;</question>
<ansArray>
<string>&quot;Bruce Willis&quot;</string>
<string>&quot;Arnie Schwarzenegger&quot;</string>
<string>&quot;Joe Pesci&quot;</string>
<string>&quot;Tom Hanks&quot;</string>
</ansArray>
<correctAns>4</correctAns>
<iDifficulty>2</iDifficulty>
</Question>
<Question>
<id>-1</id>
<question>&quot;who was the Terminator?&quot;</question>
<ansArray>
<string>&quot;John Travolta&quot;</string>
<string>&quot;Stevan Segal&quot;</string>
<string>&quot;Arnie Schwarzenegger&quot;</string>
<string>&quot;Al Pacino&quot;</string>
</ansArray>
<correctAns>3</correctAns>
<iDifficulty>3</iDifficulty>
</Question>
</questionList>

在上面的 XML 文件中,我可以读取除 ansArray 的子节点之外的所有内容,即

  <ansArray>
<string>&quot;John Travolta&quot;</string>
<string>&quot;Stevan Segal&quot;</string>
<string>&quot;Arnie Schwarzenegger&quot;</string>
<string>&quot;Al Pacino&quot;</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;
}



}

最佳答案

每次找到 xml-start-tag 时都会调用

startElement()。这意味着它适用于您示例中的以下元素(qname):

  • 问题列表
  • 问题
  • ID
  • 问题
  • ansArray
  • 字符串
  • 字符串
  • 字符串
  • 字符串
  • 正确答案
  • i难度
  • 问题
  • ID
  • 问题
  • ansArray
  • 字符串
  • 字符串
  • 字符串
  • 字符串
  • 正确答案
  • i难度

这意味着您必须自己管理 xml 数据中的位置(级别、元素树)。

关于java - 使用 SAX 解析 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21367477/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com