2012-01-17 8 views
-1

編集:完全には解決されません!
すべてのエントリをdbにどのように追加できますか。 Data1、Data2、Data3などを新しい列に追加したい。

私の実際のコードでは、以下のように、res/rawのXMLからのデータを解析するのが魅力的です。 しかし私はURLからそれを得ることができません。どちらが間違っている?SAXParser | xmlデータをベクトルからdbにパースする




私は、ネット上の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は次のようになります。
問題は、データベース内のすべてのエントリ(およびそのデータ)が必要なことです。どうすれば達成できますか?

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; 

がここにタグがしますentrys完全な文書で1回だけ終了する。このコードを次のようなエントリタグに入れてください:

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 entry: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 
    } 
関連する問題