2012-01-17 2 views
-1

Редактировать: Не полностью разрешено!
Как я могу добавить каждую запись в db. Я хочу добавить Data1, Data2, Data3 и т. Д. В новый столбец.

В моем фактическом коде ниже, анализ данных из XML в res/raw работает как шарм. Но я не могу получить его по URL-адресу. Что я делаю неправильно?SAXParser | parse xml данные через вектор до db




Я хочу, чтобы разобрать данные из 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> 

Если я разобрать его на моем пути (ниже кода), я только получить последние данные входа.
Проблема в том, что я хочу каждую запись (и ее данные) в моем 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

Пожалуйста, обратитесь в ваш код в приложение

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

здесь entrys тег завершите только один раз в полном документе. Поэтому введите этот код в тег:

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

Эта работа, но не как intendet. Я получаю больше благодарности за результат, но результат каждый раз тот же. Последняя запись, Как я могу это исправить? – Leandros

+0

Исправлено это, добавлено 'case entry: DataSet = new ParsedExampleDataSet();' to 'onStartElement()'. Теперь я хочу экспортировать его в db, как я могу добавить каждую запись? – Leandros

+0

теперь у вас есть arraylist, поиск относительно сохранения массива в db. вы получите достаточно ссылок. – jeet

0

Попробуйте разобрать, как это, здесь документ не что иное, как ваш синтаксический анализ XML-документ

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 
    }