2013-04-11 2 views
1

Java에서 sax 파서로 xml 파일을 구문 분석하고 XML 요소로 JTable을 채우려고합니다. 구문 분석이 잘 수행되고 JTable이 생성되지만 문제는 모든 요소가 동일한 행에 있고 동일한 행이 반복된다는 것입니다. 제발 도와주세요. 여기 내 코드입니다 : 내가 얻을JTable에 XML 요소 삽입하기

<?xml version="1.0" encoding="UTF-8"?> 
<company> 
<staff > 
<firstname>yong</firstname> 
<lastname>mook kim</lastname> 
<nickname>mkyong</nickname> 
<salary>100000</salary> 
</staff> 
<staff > 
<firstname>low</firstname> 
<lastname>yin fong</lastname> 
<nickname>fong fong</nickname> 
<salary>200000</salary> 
</staff> 
</company> 

그리고 테이블을는 다음과 같다 :! [여기 이미지 설명을 입력합니다] [1]

package read; 

//import java.util.ArrayList; 
import java.awt.BorderLayout; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Vector; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 
import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 

public class Read { 

    public static Vector<Vector> rowData = new Vector<Vector>(); 
    public static Vector<String> rowOne = new Vector<String>(); 

    public static void main(String argv[]) { 
     try { 
      SAXParserFactory factory = SAXParserFactory.newInstance(); 
      SAXParser saxParser = factory.newSAXParser(); 
      DefaultHandler handler; 
      handler = new DefaultHandler() { 
       // private List<Personne> satff; 
       boolean bstaff = false; 
       boolean bfname = false; 
       boolean blname = false; 
       boolean bnname = false; 
       boolean bsalary = false; 
       private int i; 

       public void startElement(String uri, String localName, String 
        qName, Attributes attributes) throws SAXException { 
        System.out.println("Start Element :" + qName); 
        if (qName.equalsIgnoreCase("staff")) { 
         bstaff = true; 
        } 
        if (qName.equalsIgnoreCase("FIRSTNAME")) { 
         bfname = true; 
        } 
        if (qName.equalsIgnoreCase("LASTNAME")) { 
         blname = true; 
        } 
        if (qName.equalsIgnoreCase("NICKNAME")) { 
         bnname = true; 
        } 
        if (qName.equalsIgnoreCase("SALARY")) { 
         bsalary = true; 
        } 
       } 

       public void endElement(String uri, String localName, 
        String qName) throws SAXException { 
        System.out.println("End Element :" + qName); 
        if ("staff".equals(qName)) { 
         rowData.addElement(rowOne); 
        }; 
       } 

       @Override 
       public void characters(char ch[], int start, int length) { 
        if (bfname) { 
         String s = new String(ch, start, length); 
         rowOne.addElement(s); 
         System.out.println("First Name : " + new String(ch, start, length)); 
         bfname = false; 
        } 
        if (blname) { 
         rowOne.addElement(new String(ch, start, length)); 
         System.out.println("Last Name : " + new String(ch, start, length)); 
         blname = false; 
        } 
        if (bnname) { 
         rowOne.addElement(new String(ch, start, length)); 
         System.out.println("Nick Name : " + new String(ch, start, length)); 
         bnname = false; 
        } 
        if (bsalary) { 
         rowOne.addElement(new String(ch, start, length)); 
         System.out.println("Salary : " + new String(ch, start, length)); 
         //rowData.addElement(rowOne); 
         bsalary = false; 
        } 
        System.out.println("longueur" + rowOne.size()); 
       } 
      }; 
      saxParser.parse("file.xml", handler); 
      JFrame frame = new JFrame(); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      Vector<String> columnNames = new Vector<String>(); 
      columnNames.addElement("firstname"); 
      columnNames.addElement("lastname"); 
      columnNames.addElement("nickname"); 
      columnNames.addElement("salary"); 
      columnNames.addElement(" "); 
      columnNames.addElement(" "); 
      columnNames.addElement(" "); 
      columnNames.addElement(" "); 
      JTable table = new JTable(rowData, columnNames); 
      JScrollPane scrollPane = new JScrollPane(table); 
      frame.add(scrollPane, BorderLayout.CENTER); 
      frame.setSize(300, 150); 
      frame.setVisible(true); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

내 원래 XML 파일은 folowing입니다

나는 무엇이 오류인지 이해하지 못했다! 당신의 startElement 방법에서

+1

1) 코드 블록에 일관되고 논리적 인 들여 쓰기를 사용하십시오. 코드의 들여 쓰기는 사람들이 프로그램 흐름을 이해하도록 돕기위한 것입니다! 2)'! [여기에 이미지 설명을 입력하십시오.] [1]'뭔가 잘못되었습니다. 관련 스크린 샷이있는 경우 이미지 공유 사이트에 업로드하여 링크하십시오. –

+0

이미지 링크를 찾을 수 없습니다. – trashgod

답변

2

이 변경 :

if (qName.equalsIgnoreCase("staff")) 
{ 
    rowOne = new Vector<String>(); 
    bstaff = true; 
} 

다른 if 문은 변경되지 않습니다. 각 staff 요소는 Vector에 있습니다.

+0

도움을 많이 주셔서 감사합니다. 아주 잘 작동합니다;) – IMIDEV