2014-04-24 1 views
1

현재 XML 파일 용 파서를 만들고 있는데 링크를 검색하기위한 추가 옵션을 추가 할 때까지 모든 것이 올바르게 작동합니다. 같은 이름의 여러 태그가 있고 특정 속성 값을 가진 하나의 특정 태그가 필요합니다.XmlPullParser - 특정 attributevalue를 사용하여 태그에서 데이터 가져 오기

... 
<artist> 
    <name>Venom</name> 
    <mbid>5ddddef1-fd5a-4ca8-8e89-df4adff4239b</mbid> 
    <url>Venom</url> 
    <image size="small">http://userserve-ak.last.fm/serve/34/35628151.png</image> 
    <image size="medium">http://userserve-ak.last.fm/serve/64/35628151.png</image> 
    <image size="large">http://userserve-ak.last.fm/serve/126/35628151.png</image> 
    <image size="extralarge">http://userserve-ak.last.fm/serve/252/35628151.png</image> 
</artist> 
... 

나는 "extralarge"에 링크를 잡아 먹습니다.

내 현재 코드 :

... 
private TrackInfo readTrack(XmlPullParser parser) throws XmlPullParserException, IOException { 
    parser.require(XmlPullParser.START_TAG, ns, "track"); 
    String artist = null; 
    String artistPic = null; 
    String artisMbid = null; 
    String song = null; 
    String album = null; 
    while (parser.next() != XmlPullParser.END_TAG) { 
     if (parser.getEventType() != XmlPullParser.START_TAG) { 
      continue; 
     } 
     String name = parser.getName(); 
     if (name.equals("artist")) { 

      parser.require(XmlPullParser.START_TAG, ns, "artist"); 
      while (parser.next() != XmlPullParser.END_TAG) { 
       if (parser.getEventType() != XmlPullParser.START_TAG) { 
        continue; 
       } 
       String artistName = parser.getName(); 
       if (artistName.equals("name")) { 
        artist = readArtist(parser); 
       } else if (artistName.equals("mbid")) { 
        artisMbid = readArtistMbid(parser); 
       } else if (artistName.equals("image")) { 
        artistPic = readArtistPic(parser); 
       } else { 
        skip(parser); 
       } 
      } 
     } else if (name.equals("name")) { 
      song = readSong(parser); 
     } else if (name.equals("album")) { 
      album = readAlbum(parser); 
     } else { 
      skip(parser); 
     } 
    } 
    return new TrackInfo(artist, artistPic, artisMbid, song, album); 
} 

... 

private String readArtistPic(XmlPullParser parser) throws XmlPullParserException, IOException { 
    String artistPic = ""; 
    parser.require(XmlPullParser.START_TAG, ns, "image"); 
    String tag = parser.getName(); 
    String relType = parser.getAttributeValue(null, "size"); 
    if (tag.equals("image")) { 
     if (relType.equals("extralarge")) { 
      artistPic = readText(parser); 
      parser.nextTag(); 
     } 
    } 
    parser.require(XmlPullParser.END_TAG, ns, "image"); 

    return artistPic; 
} 

... 

private String readText(XmlPullParser parser) throws XmlPullParserException, IOException { 
    String result = ""; 
    if (parser.next() == XmlPullParser.TEXT) { 
     result = parser.getText(); 
     parser.nextTag(); 
    } 
    return result; 
} 
... 

가 오류 :

E/CurrentTrackFragment logging﹕ XmlPullParserException: org.xmlpull.v1.XmlPullParserException: expected: END_TAG {null}image (position:START_TAG <image size='small'>@10:29 in [email protected]) 

누구나 어떤 생각이 어떻게 처리 하는가?

솔루션!

저는 Raghunandan이 저에게 준 예제로 작업하기 시작했습니다. 결국 나는 코드를 단순화하고 그가 제안한 'check = true'를 추가했습니다.

private TrackInfo readTrack(XmlPullParser parser) throws XmlPullParserException, IOException { 
    parser.require(XmlPullParser.START_TAG, ns, "track"); 
    boolean nowPlaying = false; 
    String artist = null; 
    String artistPic = null; 
    String artistMbid = null; 
    String song = null; 
    String songUrl = null; 
    String album = null; 
    String albumPic = null; 
    int playedUts = 0; 
    while (parser.next() != XmlPullParser.END_TAG) { 
     if (parser.getEventType() != XmlPullParser.START_TAG) { 
      continue; 
     } 
     String name = parser.getName(); 
     if (name.equals("artist")) { 
      parser.require(XmlPullParser.START_TAG, ns, "artist"); 
      while (parser.next() != XmlPullParser.END_TAG) { 
       if (parser.getEventType() != XmlPullParser.START_TAG) { 
        continue; 
       } 
       String artistName = parser.getName(); 
       if (artistName.equals("name")) { 
        artist = readArtist(parser); 
       } else if (artistName.equals("mbid")) { 
        artistMbid = readArtistMbid(parser); 
       } else if (artistName.equals("image")) { 
        boolean check = false; 
        String imagesize = parser.getAttributeValue(null, "size"); 
        if (imagesize.equals("extralarge")) { 
         check = true; 
        } 
        if (check) { 
         artistPic = readArtistPic(parser); 
        } else { 
         parser.nextText(); 
        } 
       } else { 
        skip(parser); 
       } 
      } 
     } else if (name.equals("name")) { 
      song = readSong(parser); 
     } else if (name.equals("url")) { 
      songUrl = readSongUrl(parser); 
     } else if (name.equals("album")) { 
      album = readAlbum(parser); 
     } else if (name.equals("date")) { 
      playedUts = Integer.parseInt(readUts(parser)); 
     } else { 
      skip(parser); 
     } 
    } 
    return new TrackInfo(nowPlaying, artist, artistPic, artistMbid, song, songUrl, 
      album, albumPic, playedUts); 
} 

... 

private String readArtistPic(XmlPullParser parser) throws XmlPullParserException, IOException { 
    parser.require(XmlPullParser.START_TAG, ns, "image"); 
    String artistPic = readText(parser); 
    parser.require(XmlPullParser.END_TAG, ns, "image"); 
    return artistPic; 
} 

... 
+0

당신이 내가 생각하는 앱을 디버깅 마십시오'parser.require (XmlPullParser.START_TAG, NS, "이미지"); ' 오류가 발생하는이 행은 무엇이 잘못되었는지를 알기가 어려운 전체 스택 트레이스가없는 – Sree

+0

입니다. 내가 예제를 게시 할 수 있습니다 – Raghunandan

+0

필자는 stacktrace를 얻으려고 필사적으로 노력하고 있지만 위의 정보는 내가 다시 얻는 유일한 정보입니다. – Daemun

답변

3

전체 스택 트레이스가 없으면 실수를 지적하기 어렵습니다. 그러나 아래 작품.

public class XMLPullParserHandler { 

    private String text; 

    public XMLPullParserHandler() { 

    } 
    public Void parse(InputStream is) { // pas the input stream 
     XmlPullParserFactory factory = null; 
     XmlPullParser parser = null; 
     try { 
      factory = XmlPullParserFactory.newInstance(); 
      factory.setNamespaceAware(true); 
      parser = factory.newPullParser(); 

      parser.setInput(is, null); 
      boolean check =false; 

      //factory instantiates an object 

      int eventType = parser.getEventType(); 
      while (eventType != XmlPullParser.END_DOCUMENT) { 
       String tagname = parser.getName(); 
       switch (eventType) { 
       case XmlPullParser.START_TAG: 
        if (tagname.equalsIgnoreCase("image")) { 

         if(parser.getAttributeValue(null, "size").equals("extralarge")) 
         { 
          check=true; 
         } 

        } 


        break; 

       case XmlPullParser.TEXT: 
        text = parser.getText(); 
        break; 

       case XmlPullParser.END_TAG: 
          String val = null; 
         if (tagname.equalsIgnoreCase("name")) { 

          val=text; 
          Log.i(""," name is "+val); 

         } 
         else if (tagname.equalsIgnoreCase("mbid")) 
         { 

          val=text; 
          Log.i(""," mbid is "+val); 

          } 
         else if (tagname.equalsIgnoreCase("url")) 
         { 

          val=text; 
          Log.i(""," url is "+val); 

          } 
         else if (tagname.equalsIgnoreCase("image")) 
         { 

          val=text; 
          if(check == true) 
          Log.i(""," image is "+val); 

          } 

        break; 

       default: 
        break; 
       } 
       eventType = parser.next(); 
      } 

     } catch (XmlPullParserException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 
} 

로그

04-24 04:39:06.906: I/(1539): name is Venom 
04-24 04:39:06.906: I/(1539): mbid is 5ddddef1-fd5a-4ca8-8e89-df4adff4239b 
04-24 04:39:06.916: I/(1539): url is Venom 
04-24 04:39:06.916: I/(1539): name is http://userserve-ak.last.fm/serve/252/35628151.png 

대체 솔루션 :

private TrackInfo readTrack(XmlPullParser parser) throws XmlPullParserException, IOException { 
    parser.require(XmlPullParser.START_TAG, ns, "track"); 
    boolean nowPlaying = false; 
    String artist = null; 
    String artistPic = null; 
    String artistMbid = null; 
    String song = null; 
    String songUrl = null; 
    String album = null; 
    String albumPic = null; 
    int playedUts = 0; 
    while (parser.next() != XmlPullParser.END_TAG) { 
     if (parser.getEventType() != XmlPullParser.START_TAG) { 
      continue; 
     } 
     String name = parser.getName(); 
     if (name.equals("artist")) { 
      parser.require(XmlPullParser.START_TAG, ns, "artist"); 
      while (parser.next() != XmlPullParser.END_TAG) { 
       if (parser.getEventType() != XmlPullParser.START_TAG) { 
        continue; 
       } 
       String artistName = parser.getName(); 
       if (artistName.equals("name")) { 
        artist = readArtist(parser); 
       } else if (artistName.equals("mbid")) { 
        artistMbid = readArtistMbid(parser); 
       } else if (artistName.equals("image")) { 
        boolean check = false; 
        String imagesize = parser.getAttributeValue(null, "size"); 
        if (imagesize.equals("extralarge")) { 
         check = true; 
        } 
        if (check) { 
         artistPic = readArtistPic(parser); 
        } else { 
         parser.nextText(); 
        } 
       } else { 
        skip(parser); 
       } 
      } 
     } else if (name.equals("name")) { 
      song = readSong(parser); 
     } else if (name.equals("url")) { 
      songUrl = readSongUrl(parser); 
     } else if (name.equals("album")) { 
      album = readAlbum(parser); 
     } else if (name.equals("date")) { 
      playedUts = Integer.parseInt(readUts(parser)); 
     } else { 
      skip(parser); 
     } 
    } 
    return new TrackInfo(nowPlaying, artist, artistPic, artistMbid, song, songUrl, 
      album, albumPic, playedUts); 
} 

... 

private String readArtistPic(XmlPullParser parser) throws XmlPullParserException, IOException { 
    parser.require(XmlPullParser.START_TAG, ns, "image"); 
    String artistPic = readText(parser); 
    parser.require(XmlPullParser.END_TAG, ns, "image"); 
    return artistPic; 
} 

... 
+0

예를 들어 주셔서 감사합니다. 나는 실제로 현재 작업중인 코드에 추가 할 수있는 코드를 찾고 코드를 사용하여 완전한 다시 작성을 의미하지만 어쩌면 그 코드에서 유용한 정보를 얻을 수 있습니다. 나는 너를 계속 게시 할 것이다! – Daemun

+0

@Daemun 그 다르지 않습니다. 그것의 동일한 XML 당겨 파서. 그것은 같은 방식으로 작동합니다. – Raghunandan

+0

알았습니다! 내 원래 게시물에 대답을 게시 할 것입니다. 감사! – Daemun