2014-01-26 2 views
0

안녕하세요, 내 XML 파일을 읽으려면 어떻게해야하는지 알아내는 데 어려움이 있습니다.XML로 SAX 구문 분석

나는 Sax를 사용하지만 나는 "ansArray"의 자식 노드를 SAX가 읽을 수있게하는 것 같습니다. 내 XML이 잘못된 형식으로 작성되었는지 확실하지 않아서 도움이 될 것입니다.

NB "AnsArray"에 4 개의 문자열 항목이있는 XStream을 사용하여 XML 문서가 저장되었습니다.

XML의 DOC : 위의 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> 

내가 ansArray의 자식 noes를 제외한 모든 것을 읽을 수 있습니다 즉

<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; 
    } 



} 
+1

음 .. 왜 XmlPullParser를 사용하지 않습니까? –

+1

Sax-parser는 XML 파일을 읽는 아주 좋은 방법입니다. 그것은 많은 플랫폼에서 지원되며 당신은 그것으로 vety 큰 XML 파일을 구문 분석 할 수 있습니다. – AlexS

답변

2

startElement()은 xml-start-tag가 발견 될 때마다 호출됩니다. 즉, 당신의 다음 요소 (qname를) 예를 들면 의미 :

  • questionList
  • 질문
  • ID
  • 질문
  • ansArray
  • 문자열
  • 문자열
  • 문자열
  • 문자열
  • correctAns
  • iDifficulty
  • 질문
  • ID
  • 질문
  • ansArray
  • 문자열
  • 문자열
  • 문자열
  • 문자열
  • correctAns
  • iDifficulty 당신은 XML 데이터 자신 (레벨 요소 트리)에 사용자의 위치를 ​​관리하는 것을 의미

.

+0

오른쪽 트랙에 도움을 주셔서 감사 드리며 마지막으로 작업하게되었습니다. –