2012-01-17 2 views
-1

편집 : 완전히 해결되지!
모든 항목을 db에 어떻게 추가 할 수 있습니까? Data1, Data2, Data3 등을 새 열에 추가하려고합니다.

아래 실제 코드에서는 res/raw의 XML에서 파싱 데이터가 매력처럼 작동합니다. 하지만 URL에서 가져올 수 없습니다. 내가 잘못하고있는거야?SAXParser | XML 데이터베이스를 통해 XML 데이터를 구문 분석




나는 그물에 XML 데이터를 구문 분석합니다.

<entrys> 
    <entry> 
    <data1>a number</data1> 
    <data2>a name</data2> 
    <data3>a webUrl</data3> 
    <data4>a streamUrl</data4> 
    <data5>a logoUrl</data5> 
    </entry> 
    <entry> 
    <data1>other number</data1> 
    <data2>other name</data2> 
    <data3>other webUrl</data3> 
    <data4>other streamUrl</data4> 
    <data5>other logoUrl</data5> 
    </entry> 

<-- more entrys like this, up to one number defined in another xml --> 
</entrys> 

나는 내 방식 (아래 코드)에 구문 분석하면, 내가 마지막 항목 데이터를 얻을 : XML은 것 같습니다.
문제는, 필자는 모든 항목 (및 해당 데이터)을 db로 원합니다. 그것을 어떻게 성취 할 수 있습니까?

class ParsedExampleDataSet { 
    private String data1; 
    private String data2; 
    private String data3; 
    private String data4; 
    private String data5; 

    public String toString() { 
     return "entry ID: " + data1 + "entry Name: " 
       + data2 + "entry webUrl: " + data3 
       + "entry streamUrl: " + data4 
       + "entry Logo: " + data5; 
    } 

    public String getdata1() { return data1; } 
    public void setdata1(String data1) { this.data1 = data1; } 
    public String getdata2() { return data2; } 
    public void setdata2(String data2) { this.data2 = data2; } 
    public String getdata3() { return data3; } 
    public void setdata3(String data3) { this.data3 = data3; } 
    public String getdata4() { return data4; } 
    public String getdata5() { return data5; } 
    public void setdata4(String data4) { 
     this.data4 = data4; 
    } 
    public void setdata5(String data5) { 
     this.data5 = data5; 
    } 
} 

class ContentHandler extends DefaultHandler { 
    private enum Tags { 
     entry, data1, data2, data3, data4, data5, entrys 
    } 

    private boolean in_entryTag = false; 
    private boolean in_entrys = false; //opened at document start, closed at document end 
    private boolean in_entry = false; //opened at new entry, closed after entry completet 
    private boolean in_data1 = false; //the entry id 
    private boolean in_data2 = false; //entry Name 
    private boolean in_data3 = false; //entry weburl 
    private boolean in_data4 = false; //entry streamUrl 
    private boolean in_data5 = false; // Url to entry logo 

    private ParsedExampleDataSet DataSet; 
    private Vector<ParsedExampleDataSet> MyParsedExampleDataSets; 


    public ContentHandler() { 
     super(); 
     this.MyParsedExampleDataSets = new Vector<ParsedExampleDataSet>(); 
    } 

    public Vector<ParsedExampleDataSet> getParsedExampleDataSets() { 
     return this.MyParsedExampleDataSets; 
    } 

    public void startDocument() throws SAXException { } 
    public void endDocument() throws SAXException { } 

    public void startElement(String n, String l, String q, Attributes a) { 
     switch(Tags.valueOf(l)) { 
      case entry: 
       in_entryTag = true; 
       DataSet = new ParsedExampleDataSet(); 
       break; 
      case data1: 
       in_data1 = true; 
       break; 
      case data2: 
       in_data2 = true; 
       break; 
      case data3: 
       in_data3 = true; 
       break; 
      case data4: 
       in_data4 = true; 
       break; 
      case data5: 
       in_data5 = true; 
       break; 
      case entrys: 
       break; 
     } 
    } 

    public void endElement(String n, String l, String q) { 
     switch(Tags.valueOf(l)) { 
      case entry: 
       in_entryTag = false; 
       MyParsedExampleDataSets.add(DataSet); 
       break;    
      case data1: 
      in_data1 = false; 
      break;  
      case data2: 
      in_data2 = false; 
      break;    
      case data3: 
      in_data3 = false; 
      break;    
      case data4: 
      in_data4 = false; 
      break;    
      case data5: 
      in_data5 = false; 
      break;    
      case entrys: 
       break; 
     } 
    } 

    public void characters(char ch[], int start, int length) { 
     if(this.in_data1){ 
      DataSet.setdata1(new String(ch, start, length)); 
     }else if(this.in_data2) { 
      DataSet.setdata2(new String(ch, start, length)); 
     }else if(this.in_data3) { 
      DataSet.setdata3(new String(ch, start, length)); 
     }else if(this.in_data4) { 
      DataSet.setdata4(new String(ch, start, length)); 
     }else if(this.in_data5) { 
      DataSet.setdata5(new String(ch, start, length)); 
     } 

    } 
} 

public class XMLparserSample extends Activity { 
    private TextView myTextView; 
    private static final String TAG = XMLparserSample.class.getSimpleName(); 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 

     Vector<ParsedExampleDataSet> test = read(getResources().openRawResource(R.raw.sample)); 

     String text = ""; 
     for(int i=0; i < test.size(); i++) 
      text += test.get(i).toString(); 

     myTextView = (TextView) findViewById(R.id.tv);   
     myTextView.setText(text); 
     Log.d(TAG, "vector = " + test); 
    } 

    public Vector<ParsedExampleDataSet> read(InputStream in) { 
     SAXParserFactory spf = SAXParserFactory.newInstance(); 
     SAXParser sp; 
     try { 
      sp = spf.newSAXParser(); 
      XMLReader xr = sp.getXMLReader(); 
      ContentHandler ch = new ContentHandler(); 
      xr.setContentHandler(ch); 
      xr.parse(new InputSource(in)); 
      return ch.getParsedExampleDataSets();     
     } catch (ParserConfigurationException e) { 
     } catch (SAXException e) { 
     } catch (IOException e) {} 
     return null; 
    }  
} 
+0

전체 구문 분석 코드를 게시하십시오. – kosa

+0

전체 코드가 추가되었습니다. – Leandros

+0

MyParsedExampleDataSets에 데이터 세트를 추가하지 않았습니다. MyParsed에 모든 항목을 추가하고 반환하십시오. 그렇게하면 데이터 집합의 벡터를 얻을 수 있습니다. – kosa

답변

1

응용 프로그램에 코드에 제발 봐 아무것도하지만 구문 분석 XML 문서

case entrys: 
       MyParsedExampleDataSets.add(DataSet); 
       break; 

여기에 태그 것 져야 할 엔트리 전체 문서에서 한 번만 끝내십시오. 이 코드를 다음과 같이 입력 태그에 넣으십시오.

public void endElement(String n, String l, String q) { 
     switch(Tags.valueOf(l)) { 
      case entry: 
       in_entryTag = false; 
       MyParsedExampleDataSets.add(DataSet); 

       break;    
      case data1: 
      in_data1 = false; 
      break;  
      case data2: 
      in_data2 = false; 
      break;    
      case data3: 
      in_data3 = false; 
      break;    
      case data4: 
      in_data4 = false; 
      break;    
      case data5: 
      in_data5 = false; 
      break;    
      case entrys: 
       break; 
     } 
    } 
+0

이 작품이지만 의도는 아닙니다. 이제는 한 가지 결과에 더 감사 드리지만 그 결과는 매번 동일합니다. 마지막 항목, 어떻게 해결할 수 있습니까? – Leandros

+0

직접 수정하여'case 항목 : DataSet = new ParsedExampleDataSet();을 onStartElement()에 추가했습니다. 이제 그것을 db로 내보내려고합니다. 어떻게 모든 항목을 추가 할 수 있습니까? – Leandros

+0

이제 데이터베이스에 배열을 저장하는 것과 관련하여 arraylist를 검색했습니다. 당신은 충분한 연결을 얻을 것이다. – jeet

0

시도는 다음과 같이 구문 분석, 여기 문서는

NodeList entrysnodeList = doc.getElementsByTagName("entrys"); 
     for (int i = 0; i < ccnodeList.getLength(); i++) { 
//loop through the results 

// Again take the nodelist for entry like above in the same loop 
// then read one by one 
    }