2011-10-24 4 views
0

우선이 자바/안드로이드 개발 세계를 처음 접해 보았으므로 나에게 맨 처음으로 물어볼 수도있다. :)
어쨌든, 나는 하루 종일이 문제로 하루 종일 쭉 피로를 and다. 그리고 나는 내 자신으로 어떤 해결책을 찾아 낼 수 없으며 나는이 문제를 우회하기 위해 아이디어를 찾기 위해 얇은 웹을 검색했다.SAX XML 파서가 특수 문자로 문제를 일으키기

외부 XML 파일의 데이터를 구문 분석하는 Android 앱을 개발하려고합니다.



    public class NewSAXHandler implements ContentHandler 
    { 
     private String DEBUGTAG = "NewSAXHandler"; 

     public static setNews news = null; 
     boolean currentElement = false; 
     String currentValue = null; 



     public static setNews getNews() 
     { 
      return news; 
     } 

     public static void setNewsList(setNews news) 
     { 
      NewSAXHandler.news = news; 
     } 

     @Override 
     public void startDocument() throws SAXException { 
     // TODO Auto-generated method stub 
     } 

     @Override 
     public void endDocument() throws SAXException { 
     // TODO Auto-generated method stub 
     }  

     @Override 
     public void startElement(String uri, String localName, String qname, Attributes attr) throws SAXException 
     { 
      currentElement = true; 
      if (localName.equalsIgnoreCase("channel")) 
       news = new setNews(); 
       Log.d(DEBUGTAG, localName); 
     } 

     @Override 
     public void endElement(String uri, String localName, String qName) throws SAXException 
     { 
      if (localName.equalsIgnoreCase("title")) 
      { 
       news.setHeadline(currentValue); 
       Log.d(DEBUGTAG, localName); 
       Log.d(DEBUGTAG, currentValue);   
      } 
      else if (localName.equalsIgnoreCase("pubdate")) 
      { 
       news.setDate(currentValue); 
       Log.d(DEBUGTAG, localName); 
       Log.d(DEBUGTAG, currentValue);   
      } 
     } 

     @Override 
     public void characters(char[] ch, int start, int length) throws SAXException 
     { 
      if (currentElement) 
      { 
       currentValue = new String(ch, start, length).replaceAll("\\r\\n|\\r|\\n", " "); 
       currentElement = false; 
      } 
     } 

     @Override 
     public void ignorableWhitespace(char[] ch, int start, int length)throws SAXException 
     { 

     } 

     @Override 
     public void endPrefixMapping(String prefix) throws SAXException 
     { 

     } 

     @Override 
     public void processingInstruction(String target, String data)throws SAXException 
     { 

     } 

     @Override 
     public void setDocumentLocator(Locator locator) 
     { 

     } 

     @Override 
     public void skippedEntity(String name) throws SAXException 
     { 

     } 

     @Override 
     public void startPrefixMapping(String prefix, String uri)throws SAXException 
     { 

     } 
    } 

을 그리고 XML 파일에서 구문 분석 :

내 파서는 다음과 같습니다



    10-24 20:03:32.901: D/NewSAXHandler(975): rss 
    10-24 20:03:32.901: D/NewSAXHandler(975): channel 
    10-24 20:03:32.901: D/NewSAXHandler(975): title 
    10-24 20:03:32.901: D/NewSAXHandler(975): title 
    10-24 20:03:32.901: D/NewSAXHandler(975): www.HLTV.org News 
    10-24 20:03:32.901: D/NewSAXHandler(975): link 
    10-24 20:03:32.912: D/NewSAXHandler(975): description 
    10-24 20:03:32.912: D/NewSAXHandler(975): item 
    10-24 20:03:32.912: D/NewSAXHandler(975): title 
    10-24 20:03:32.912: D/NewSAXHandler(975): title 
    10-24 20:03:32.912: D/NewSAXHandler(975): http://www.hltv.org/HLTV.org News 
    10-24 20:03:32.912: D/NewSAXHandler(975): Photos: Final ones from ESWC 
    10-24 20:03:32.912: D/NewSAXHandler(975): link 
    10-24 20:03:32.912: D/NewSAXHandler(975): pubDate 
    10-24 20:03:32.922: D/NewSAXHandler(975): pubDate 
    10-24 20:03:32.922: D/NewSAXHandler(975): http://www.hltv.org/news/7692-photos-final-ones-from-eswcMon, 24 Oct 2011 21:17:00 +0200 
    10-24 20:03:32.922: D/NewSAXHandler(975): item 
    10-24 20:03:32.922: D/NewSAXHandler(975): title 
    10-24 20:03:32.932: W/System.err(975): org.apache.harmony.xml.ExpatParser$ParseException: At line 16, column 23: not well-formed (invalid token) 
    10-24 20:03:32.942: W/System.err(975): at org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:520) 
    10-24 20:03:32.952: W/System.err(975): at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:479) 
    10-24 20:03:32.952: W/System.err(975): at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:318) 
    10-24 20:03:32.952: W/System.err(975): at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:275) 
    10-24 20:03:32.962: W/System.err(975): at jj.rssReader.hltvorg.Hltvorg.onCreate(Hltvorg.java:49) 
    10-24 20:03:32.962: W/System.err(975): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
    10-24 20:03:32.962: W/System.err(975): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
    10-24 20:03:32.971: W/System.err(975): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
    10-24 20:03:32.971: W/System.err(975): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
    10-24 20:03:32.981: W/System.err(975): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
    10-24 20:03:32.981: W/System.err(975): at android.os.Handler.dispatchMessage(Handler.java:99) 
    10-24 20:03:32.981: W/System.err(975): at android.os.Looper.loop(Looper.java:123) 
    10-24 20:03:32.992: W/System.err(975): at android.app.ActivityThread.main(ActivityThread.java:3683) 
    10-24 20:03:32.992: W/System.err(975): at java.lang.reflect.Method.invokeNative(Native Method) 
    10-24 20:03:33.002: W/System.err(975): at java.lang.reflect.Method.invoke(Method.java:507) 
    10-24 20:03:33.002: W/System.err(975): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
    10-24 20:03:33.002: W/System.err(975): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
    10-24 20:03:33.013: W/System.err(975): at dalvik.system.NativeStart.main(Native Method) 

그것을 : 나는 응용 프로그램을 실행할 때 다음

http://www.hltv.org/news.rss.php

로그입니다 오류가 '문자'에서 오는 것처럼 보입니다.
인코딩이 XML 파일에 없기 때문에 볼 수 없지만 UTF-8이라고 생각합니다.
나는 행운없이 각 문자를 저장하기 위해 StringBuilder를 사용해 보았습니다.

필자는 XML 파서가 이러한 특수 문자를 단독으로 변환한다고 생각했지만 em이 맘에 들지 않는 것 같습니다.

나는이 파일을 구문 분석하려고하면 :

http://www.hltv.org/forum.rss.php

그런 다음 그것을 잘 작동합니다.

누구나 새로운 아이디어가 있습니까? 위의 필립 말했다 당신이 더 이상 내 코드가 필요한 경우

**,
예스퍼

+0

내가 '' 표준 캐릭터 세트 (거의 alle 그 인코딩 점유율)의 일부가 아닌'때문에 UTF-8이 정확하게 문제 같아요. 이 파일에서 인코딩은 ISO-8859-1 –

+0

으로 정의되어 있습니다. 바로 여기에서 바보가됩니다. 그러나 대답에 감사드립니다. 응답하지 않고 점수를 줄 수 있습니까? –

답변

2

을 :) 그렇게 말

베스트 감사하십시오 문제는 인코딩이었다.

난 그냥 내 코드에 추적을 추가했습니다 :

InputSource is = new InputSource(url.openStream()); 
is.setEncoding("ISO-8859-1"); 
Reader.parse(is); 
+0

답변을 수락 할 수 있습니까? TIA – lkuty

+0

깜빡하고, 지금 완료 :) –

관련 문제