2012-06-21 2 views
0

검색의 첫 번째 결과를 검색하려고합니다. 검색은 xml 파일을 반환하고, 저는 XML을 sax 파서로 처리합니다. 사실 xml 파일을 구문 분석하고 싶습니다. 검색 결과의 첫 번째 결과를 처리하면 멈 춥니 다.그냥 xml 파일의 첫 번째 결과를 검색하십시오.

즉 : 나는이 파일을 구문 분석하고 싶습니다 : http://musicbrainz.org/ws/2/release?query=barcode:606949062927 그리고 첫 번째 결과 (Eminem에서 앨범)를 검색합니다. 하지만 코드를 사용할 때는 마지막 결과 (Daniel Swain의 앨범)를 저장합니다. 원하지 않는 결과입니다. 그래서 첫 번째 결과 이후 파싱을 막을 수 있다면이 방법이 훨씬 더 좋습니다.

부울 값을 firstResult으로 설정하면 가능하다고 생각하고 첫 번째 결과를 처리하기 위해 완료하면 true로 설정하지만 실제로 더러운 것으로 나타납니다. 다른 방법이 있다고 생각하십니까?

public DataMusic parseBarcode(InputStream is) { 

    final DataMusic resultAlbum = new DataMusic(); 

    RootElement root = new RootElement(ATOM_NAMESPACE,"metadata"); 
    Element releaseList=root.getChild(ATOM_NAMESPACE,"release-list"); 
    Element release = releaseList.getChild(ATOM_NAMESPACE,"release"); 
    Element title = release.getChild(ATOM_NAMESPACE,"title"); 
    Element artistCredit = release.getChild(ATOM_NAMESPACE,"artist-credit"); 
    Element nameCredit = artistCredit.getChild(ATOM_NAMESPACE,"name-credit"); 
    Element artist = nameCredit.getChild(ATOM_NAMESPACE,"artist"); 
    Element artistName = artist.getChild(ATOM_NAMESPACE, "name"); 
    releaseList.setStartElementListener(new StartElementListener() { 
     @Override 
     public void start(Attributes attributes) { 
      if(attributes.getValue("count").equals(null) || attributes.getValue("count").equals("") || attributes.getValue("count").equals("0")) { 
       resultAlbum.setMBId(null); 
       resultAlbum.setAlbumName(null); 
       resultAlbum.setArtistName(null); 
       Log.w(TAG_MB, "Album was not found on MB. count=" + attributes.getValue("count") +"."); 
      } 

     } 
    }); 
    release.setStartElementListener(new StartElementListener() { 
     @Override 
     public void start(Attributes attributes) { 
      resultAlbum.setMBId(attributes.getValue("id")); 
      Log.v(TAG_MB, "Album found with id=" + attributes.getValue("id")); 
     } 

    }); 
    title.setEndTextElementListener(new EndTextElementListener() { 
     @Override 
     public void end(String body) { 
      Log.v(TAG_MB, "Album name set to " + body); 
      resultAlbum.setAlbumName(body); 
     } 

    }); 
    artistName.setEndTextElementListener(new EndTextElementListener() { 
     @Override 
     public void end(String body) { 
      Log.v(TAG_MB, "Album artist name set to " + body); 
      resultAlbum.setArtistName(body); 
     }   
    }); 
    try { 
     Log.v(TAG_MB, "Starting parsing data..."); 
     Xml.parse(is, Xml.Encoding.UTF_8, root.getContentHandler()); 
     Log.v(TAG_MB, "Finished parsing. Returning album with MBID=" + resultAlbum.getMBId() + " and name=" + resultAlbum.getAlbumName()) ; 
     return resultAlbum; 
    } catch (SAXException e) { 
     Log.e(TAG_MB + "_SAXException", "SAXException with MusicBrainz"); 
     Log.e(LOGCAT_TAG + "_SAXException",e.getMessage()); 
    } catch (IOException e) { 
     Log.w(TAG_MB+ "_IOException", "The HTTP Request wasn't good. Either 403 error, or the album wasn't found on LASTFM"); 
     Log.w(LOGCAT_TAG+ "_IOException", "" + e.getMessage(), e); 
    } 
    return null; 

}

+0

저는 XML 파서를 파싱하거나 작성하는 데 큰 팬이 아닙니다. 나에게 게으른 전화하지만 json 조금 쉬워. xml을 json으로 변환 할 때이 예제를 살펴보십시오. 어쩌면 이것은 당신에게 더 자연 스러울 것입니다. http://answers.oreilly.com/topic/278-how-to-convert-xml-to-json-in-java/ – petey

+0

Hum,이 피드는 json에서도 사용할 수 있으므로 어쩌면 구문 분석을 고려해야합니다. json. json이 xml보다 실제로 더 나은가요? 나에게 그것은 – MagicMicky

+0

다. 안드로이드는 json에 대한 꽤 좋은 아직 간단한 지원을합니다. 또한 데이터 페이로드가 적습니다 (끝 태그가 필요 없음). 당신이 아주 멋있을 필요가있는 경우에 항상 잭슨 json 파서가있다. http://jackson.codehaus.org/ – petey

답변

0

내가 DataMusic 객체의 단일 인스턴스가하는 것입니다 부울 firstResult을하는 것보다 더 나은 유일한 것은 가정 : 여기

내 코드의 일부입니다. 함수 상단에 응용 프로그램 전체 단일 인스턴스 DataMusic 개체의 Null 검사를 할 수 있습니다. null을 찾으면 처음으로 XML 구문 분석이 수행되고 있는지 확인하고 개체 값을 초기화하고 설정할 수 있습니다. 다음 번에 DataMusic의 단일 인스턴스 객체가 null이 아닌 것을 확인하고 발견하면 XML이 파싱되었고 값이 설정되었다고 결론 지을 수 있습니다.

이 설명이 도움이 되길 바랍니다.

+0

이해할 수 없지만 'resultAlbum'을 null로 설정하고 null로 설정되어 있으면 초기화 한 다음 필요한 값을 설정합니다. 하지만 그것은 최종 변수이기 때문에 초기화 할 수 없습니다. DataMusic의 getters와 setter를 참조 할 수 있습니다. 사실, 이것은 부울'firstResult'와 동일한 문제입니다. 부울 배열을 선언하여 수정하거나 자체 Object를 정의해야합니다. – MagicMicky

+0

내가 말하고자했던 것은 'DataMusic'객체의 단일 응용 프로그램 광역 인스턴스였습니다. 단일 인스턴스가있는 경우 인스턴스는 한 번만 초기화됩니다. 그리고 최초 초기화는'parseBarcode()'함수에있을 것입니다. 따라서이 Single Instance 객체를 처음 검사 할 때'null' (아직 초기화되지 않았으므로)이라고 생각할 것입니다. 그러나 두 번째로 이미 초기화되지 않았으므로'not null'을 찾습니다. 첫 번째 구문 분석 중 값. 나는 너에게 어떤 의미가 있기를 바란다. –

+0

괜찮습니다. 나는 너의 요점을 알고있다. 하지만 내 문제를 잘못 설명했을 수도 있습니다. 'parseBarcode'가 처음 호출되는지 확인하고 싶지 않습니다. 나는 XML (많은 것을 반환) 안에 포함 된 첫 번째 결과를 얻고 싶다. IE, that XML : http://musicbrainz.org/ws/2/release?query=barcode:606949062927 나는 Daniel Swain이 아닌 Eminem 앨범을 얻고 싶습니다. 그게 더 명확 해? 그렇다면 내 질문을 수정하겠습니다. – MagicMicky

관련 문제