簡體   English   中英

SAX XML Parser為特殊字符帶來麻煩

[英]SAX XML Parser giving troubles with special characters

首先,我是這個java / android開發世界的新手,所以對我來說,我可能會問一些相對新手的問題:)。
無論如何,我現在一直在努力解決這個問題,我無法通過我自己找出任何解決方案,而且我在網上搜索能夠繞過這個問題的想法。

我正在嘗試開發一個解析外部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文件:

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

這是運行應用程序時的日志:



    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)

似乎錯誤來自'角色'。
我看不到編碼,因為它不在XML文件中,但我猜它是UTF-8。
我也嘗試過使用StringBuilder存儲每個角色而沒有任何運氣。

我認為XML解析器會自己轉換這些特殊字符,但它似乎不喜歡它們。

如果我嘗試解析此文件:

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

然后它更好。

有人有任何新想法嗎?

**如果您需要我的代碼,請說出來:)

最好的祝福,
加斯帕

問題是Philipp上面說的編碼。

我剛剛在我的代碼中添加了以下內容:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM