2013-09-25 6 views
0

이것은 내가하고 싶은 것입니다. 내 XML 파일을 처리해야하는 클래스를 작성했습니다.안드로이드에서 로컬 XML 파일을 XMLPullParser로 구문 분석합니다.

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); 
        } 

    } 

는 다음 코드를

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; 

     } 

위의 함수가 반환을 사용하여 저장 위치에서이 복사 된 XML 파일을 읽어 xml 파일의 경우 InputStream; 이 InputStream을 전달하여 파서를 가져 와서 데이터를 구문 분석 할 수 있습니다.

+0

아니요,/res/xml과 같은 프로젝트 내부의 폴더에서 xml 파일을 가져온 다음 XmlPullParser에 전달하는 방법을 의미했습니다. – devShuba

+0

내 대답을 편집 했으므로 살펴 봅니다. – dd619

관련 문제