2012-09-27 2 views
0

나는 안드로이드 응용 프로그램의 res 폴더 안에 포함 된 raw라는 폴더 내에 정의한 XML 파일을 구문 분석하려고합니다. 본질적으로 XML 파일을 처리하는 방법에 대한 Android 개발자 가이드의 버전을 사용했습니다.안드로이드에서 res에서 XML 파일 구문 분석

http://developer.android.com/training/basics/network-ops/xml.html

현재 응용 프로그램을 실행하고 파일을 찾습니다, 다음 구문 분석 방법을 실행하지만 데이터를 추출 할 태그의 위치를 ​​추정하는 방법은 건너 뛸 것 같고 결과 내 Unit 유형의 배열 목록에는이 인스턴스에 이름이없는 Unit이 있습니다.

다음은 XML 파일을 구문 분석 한 클래스의 복사본입니다. 그 다음에 테스트 할 XML 파일이옵니다.

public class UnitTableXMLParser extends AsyncTask<InputStream, Void, Void> { 
    private final String ns = null; 

    public ArrayList<Unit> parse(InputStream in) throws XmlPullParserException, IOException { 
     try { 
      XmlPullParser parser = Xml.newPullParser(); 
      parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); 
      parser.setInput(in, null); 
      parser.nextTag(); 
      return readFeed(parser); 
     } finally { 
      in.close(); 
     } 
    } 

    private ArrayList<Unit> readFeed(XmlPullParser parser) throws XmlPullParserException, IOException { 
     parser.require(XmlPullParser.START_TAG, ns, "resources"); 
     while (parser.next() != XmlPullParser.END_TAG) { 
      if (parser.getEventType() != XmlPullParser.START_TAG) { 
       continue; 
      } 
      String name = parser.getName(); 

      if (name.equals("unit")) { 
       units.add(readUnit(parser)); 
      } else { 
       skip(parser); 
      } 
     } 
     return units; 
    } 

    private Unit readUnit(XmlPullParser parser) throws XmlPullParserException, IOException { 
     parser.require(XmlPullParser.START_TAG, ns, "unit"); 
     String name = null; 
     while (parser.next() != XmlPullParser.END_TAG) { 
      if (parser.getEventType() != XmlPullParser.START_TAG) { 
       continue; 
      } 

      String parserName = parser.getName(); 

      if (parserName.equals("name")) { 
       name = readName(parser); 
      } 
     } 
     return new Unit(name); 
    } 

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

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

    @Override 
    protected Void doInBackground(InputStream... params) { 
     Log.d(TAG, "UnitTableXMLParser exectued"); 
     try { 
      parse(params[0]); 
     } catch (IOException e) { 
      Log.d("Background Thread IOException", e.getMessage()); 
     } catch (XmlPullParserException e) { 
      Log.d("Background Thread XmlPullParserException", e.getMessage()); 
     } catch (Exception e) { 
      Log.d("Exception", e.getMessage()); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     xmlParsed = true; 
     super.onPostExecute(result); 
    } 
} 

그리고 XML 파일 :

XML File

그리고 출력 : 내가 잘못 갈 수 Output

어떤 아이디어가 많이 주시면 감사하겠습니다, 내가 시도 name.matches 문자열 일치를 포함하지만 아직 작동하지 않습니다.

건배,

제이미

답변

0

는 그냥 nextTag() 사양을 찾습니다. next()를 호출 해, START_TAG 또는 END_TAG의 경우는 이벤트를 돌려 주어, 그렇지 않은 경우는 새로운 XMLPullParserException를 throw합니다. 또한 텍스트 또는 문서 블록을 충족시키는 경우 어떻게 작동합니까? 그것은 사실입니다. 따라서 try 블록이 모두 중단되고 결과가 null입니다. 참으로 끔찍한 예제와 끔찍한 문서가 developer.android.com에 주어졌습니다! 그리고 나는 당신에게 안드로이드에 대한 새로운 답변을 드릴 수 없었습니다 ...