2013-09-25 3 views
0

Это то, что я хочу сделать. Я написал класс, который должен обрабатывать мой XML-файл.Разбор локального XML-файла с XMLPullParser в Android

package de.lies; 

    import java.io.IOException; 

    import org.xmlpull.v1.XmlPullParser; 
    import org.xmlpull.v1.XmlPullParserException; 

    public class Entry { 
    private static final String ns = null; 

    public final String rank; 
    public final String source; 
    public final String date; 
    public final String headline; 
    public final String description; 
    public final String articleURL; 
    public final String sourceURL; 
    public final String imageURL; 

    private Entry(String rank, String source, String date, String headline, String description, String articleURL, String sourceURL, String imageURL){ 
     this.rank   = rank; 
     this.source   = source; 
     this.date   = date; 
     this.headline  = headline; 
     this.description = description; 
     this.articleURL  = articleURL; 
     this.sourceURL  = sourceURL; 
     this.imageURL  = imageURL; 
    } 

    private Entry readEntry (XmlPullParser parser) throws XmlPullParserException, IOException{ 
     parser.require(XmlPullParser.START_TAG, ns, "entry"); 
     String rank   = null; 
     String source  = null; 
     String date   = null; 
     String headline  = null; 
     String description = null; 
     String articleURL = null; 
     String sourceURL = null; 
     String imageURL  = null; 

     while(parser.next() != XmlPullParser.END_TAG) { 
      if(parser.getEventType() != XmlPullParser.START_TAG){ 
       continue; 
      } 
      String name  = parser.getName(); 

      if(name.equals("rank")){ 
       rank  = readRank(parser); 
      } else if(name.equals("source")){ 
       source  = readSource(parser); 
      } else if(name.equals("date")){ 
       date  = readDate(parser); 
      } else if(name.equals("headline")){ 
       headline = readHeadline(parser); 
      } else if(name.equals("description")){ 
       description = readDescription(parser); 
      } else if(name.equals("articleURL")){ 
       articleURL = readArticleURL(parser); 
      } else if(name.equals("sourceURL")){ 
       sourceURL = readSourceURL(parser); 
      } else if(name.equals("imageURL")){ 
       imageURL = readImageURL(parser); 
      } else { 
       skip(parser); 
      } 
     } 
     return new Entry(rank, source, date, headline, description, articleURL, sourceURL, imageURL); 
    } 

    private String readRank(XmlPullParser parser) throws IOException, XmlPullParserException{ 
     parser.require(XmlPullParser.START_TAG, ns, "rank"); 
     String rank   = readText(parser); 

     parser.require(XmlPullParser.END_TAG, ns, "rank"); 
     return rank; 
    } 

    private String readSource(XmlPullParser parser) throws IOException, XmlPullParserException{ 
     parser.require(XmlPullParser.START_TAG, ns, "source"); 
     String source  = readText(parser); 

     parser.require(XmlPullParser.END_TAG, ns, "source"); 
     return source; 
    } 

    private String readDate(XmlPullParser parser) throws IOException, XmlPullParserException{ 
     parser.require(XmlPullParser.START_TAG, ns, "rank"); 
     String date   = readText(parser); 

     parser.require(XmlPullParser.END_TAG, ns, "rank"); 
     return date; 
    } 

    private String readHeadline(XmlPullParser parser) throws IOException, XmlPullParserException{ 
     parser.require(XmlPullParser.START_TAG, ns, "rank"); 
     String headline  = readText(parser); 

     parser.require(XmlPullParser.END_TAG, ns, "rank"); 
     return headline; 
    } 

    private String readDescription(XmlPullParser parser) throws IOException, XmlPullParserException{ 
     parser.require(XmlPullParser.START_TAG, ns, "rank"); 
     String description  = readText(parser); 

     parser.require(XmlPullParser.END_TAG, ns, "rank"); 
     return description; 
    } 

    private String readArticleURL(XmlPullParser parser) throws IOException, XmlPullParserException{ 
     parser.require(XmlPullParser.START_TAG, ns, "rank"); 
     String articleURL  = readText(parser); 

     parser.require(XmlPullParser.END_TAG, ns, "rank"); 
     return articleURL; 
    } 

    private String readSourceURL(XmlPullParser parser) throws IOException, XmlPullParserException{ 
     parser.require(XmlPullParser.START_TAG, ns, "rank"); 
     String sourceURL  = readText(parser); 

     parser.require(XmlPullParser.END_TAG, ns, "rank"); 
     return sourceURL; 
    } 

    private String readImageURL(XmlPullParser parser) throws IOException, XmlPullParserException{ 
     parser.require(XmlPullParser.START_TAG, ns, "rank"); 
     String imageURL  = readText(parser); 

     parser.require(XmlPullParser.END_TAG, ns, "rank"); 
     return imageURL; 
    } 

    private String readText(XmlPullParser parser) throws IOException, XmlPullParserException { 
     String result = ""; 

     if (parser.next() == XmlPullParser.TEXT) { 
      result = parser.getText(); 
      parser.nextTag(); 
     } 
     return result; 
    } 


    private void skip(XmlPullParser parser) throws XmlPullParserException, IOException { 
     if (parser.getEventType() != XmlPullParser.START_TAG) { 
      throw new IllegalStateException(); 
     } 
     int depth = 1; 
     while (depth != 0) { 
      switch (parser.next()) { 
      case XmlPullParser.END_TAG: 
       depth--; 
       break; 
      case XmlPullParser.START_TAG: 
       depth++; 
       break; 
      } 
     } 
    } 
} 

Проблема, с которой я столкнулся, заключается в том, как обрабатывать XML-файл. В частности: как читать в XML-файле и как позволить классу выполнить работу над файлом и распечатать его на устройстве Android. Поблагодарили бы за любую помощь. Чтобы быть более точным У меня есть файл XML, который имеет этот макет

<entry> 
<rank>Rank 1</rank> 
    <source><![CDATA[Der Postillon]]></source> 
    <date>2013-09-24 15:11:48</date> 
    <scores> 
     <Flies>10797</Flies> 
     <Facebook>10190</Facebook> 
     <Twitter>345</Twitter> 
     <GPlus>262</GPlus> 
    </scores> 
    <headline>Wikipedia löscht FDP-Eintrag wegen fehlender Relevanz</headline> 
    <description>Berlin (dpo) - Das ging schnell. Seit gestern existiert der Wikipedia-Eintrag der FDP nicht mehr. Der mit knapp 10.000 Wörtern durchaus umfangreiche Beitrag wurde nach einer kurzen Löschdiskussion entfernt, weil er den strengen Relevanzkriterien des Online-Lexikons nicht mehr standhalten konnte. Für marginale Splitterparteien und Kleinstgruppierungen wie die Liberalen sei kein Platz in der Wikipedia. [Weiterlesen]</description> 
    <articleURL>http://www.der-postillon.com/2013/09/wikipedia-loscht-fdp-eintrag-wegen.html</articleURL> 
    <sourceURL><![CDATA[http://www.der-postillon.com]]></sourceURL> 
    <imageURL><![CDATA[http://www.10000flies.de/images/nopic.jpg]]></imageURL> 
</entry> 

Но я, кажется, не найти хорошее решение, справиться с этим. Но я уверен, что это очень легко. Я просто не могу его найти. В качестве альтернативы вы можете дать мне простой учебник о том, как читать XML-файл из локальной папки и работать с ним.

+0

Вид. Я прочитал еще один учебник и сделал это так. Спасибо, в любом случае. Дает вам правильный ответ в любом случае – devShuba

ответ

2

, если вы хотите, чтобы получить XML-файл из папки активов используйте ниже код,

public void copyXMLFromAssets() 
    { 
     AssetManager assetManager = mActivity.getAssets(); 
     File AppDirectory = new File(Environment.getExternalStorageDirectory() + "/" + dirName); 
     if (!AppDirectory.exists()) 
      { 
       AppDirectory.mkdirs(); 
      } 
       InputStream in = null; 
       OutputStream out = null; 
       try 
        { 
         in = assetManager.open(XML_name); 
         File outFile = new File(AppDirectory +"/"+XML_name);         
         out = new FileOutputStream(outFile); 
         copyFile(in, out); 
         in.close(); 
         in = null; 
         out.flush(); 
         out.close(); 
         out = null; 
        } 
       catch (IOException e) 
        { 
         Log.e("tag", "Failed to copy asset file: " + XML_name, e); 
        } 

    } 

Затем прочитайте этот скопированный файл XML из сохраненного местоположения с помощью следующего кода

public InputStream GetStreamFromXmlFileOnSDCard() 
     { 
      File file = new File(Environment.getExternalStorageDirectory() +xml_path); 
      InputStream istr = null; 
      try 
       { 
        istr = new FileInputStream(file); 
       } 
      catch (FileNotFoundException e) 
       { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      return istr; 

     } 

вышеуказанных функции возвращают InputStream для xml-файла; вы можете передать это InputStream, чтобы вытащить парсер и проанализировать ваши данные.

+0

Нет, я имел в виду, как получить xml-файл из папки внутри проекта, например/res/xml, а затем передать его в XmlPullParser – devShuba

+0

Я отредактировал свой ответ, посмотрю на него – dd619