SAXParser завершается ошибкой, когда ответ содержит хинди или другие специальные символы - PullRequest
3 голосов
/ 15 апреля 2011

Я использую синтаксический анализатор SAX для анализа XML-ответа, но он вызывает исключение.

ExpatParser$ParseException : (not well formed) invalid token

Есть ли какое-либо решение?

Вот мой код:

    HttpParams params = new BasicHttpParams();  
    HttpProtocolParams.setContentCharset(params, "UTF-8");
    HttpPost postMethod = new HttpPost(MyRequestURL);  

    DefaultHttpClient hc = new DefaultHttpClient(params); 

    postMethod.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    ResponseHandler <String> res = new BasicResponseHandler();  
    String response=hc.execute(postMethodURL,res); 


    ByteArrayInputStream byteArrayInputStream = 
        new ByteArrayInputStream(response.getBytes("UTF8"));

    /* SAXParser from the SAXPArserFactory. */
    SAXParserFactory spf = SAXParserFactory.newInstance();
    SAXParser sp = spf.newSAXParser();

    /* Get the XMLReader of the SAXParser we created. */
    XMLReader xr = sp.getXMLReader();

    /* Create a new ContentHandler and apply it to the XML-Reader*/ 
    MyHandler objHandler = new MyHandler();
    xr.setContentHandler(objHandler);      

   InputSource inputSource = new InputSource(byteArrayInputStream);
   inputSource.setEncoding("UTF-8");

   /* Parse the xml-data from our URL. */

   xr.parse(inputSource);

   /* Parsing has finished. */ 

Ответы [ 5 ]

1 голос
/ 01 апреля 2012

Это должно решить проблему:

InputSource inputSource = new InputSource(is);
inputSource.setEncoding("ISO-8859-1");
1 голос
/ 19 апреля 2011

Я не совсем уверен, что это решит вашу проблему, но я бы установил кодировку на InputSource, используя метод setEncoding().

InputSource inputSource = new InputSource(byteArrayInputStream);
inputSource.setEncoding("UTF-8");

xr.parse(inputSource);
1 голос
/ 27 апреля 2011

Попробуйте с android.util.Xml.parse ()
Первый аргумент InputStream => HttpResponse.getEntity (). GetContent ()
Второй аргумент Xml.Encoding => Xml.Encoding.UTF_8
Последний аргумент ContentHandler => ваш обработчик

0 голосов
/ 27 апреля 2011

Первый ответ

Символ амперсанда ( & ) и левая угловая скобка ( <</strong>) НЕ ДОЛЖНЫ появляться в выходных данных xml в их буквальной форме, за исключением случаев, когда они используются в качестве разделителей разметки или внутри комментарий, инструкция по обработке или раздел CDATA . Если они нужны в другом месте, их необходимо экранировать, используя либо числовые ссылки на символы, либо строки " & " и " <</strong>" соответственно.

Правая угловая скобка (> ) может быть представлена ​​с помощью строки " & gt ;", и ДОЛЖНА, для совместимости, экранироваться с помощью либо " & gt * 1022" *; "или символьная ссылка, когда она появляется в строке" ]]>"в содержимом, когда эта строка не отмечает конец CDATA раздела.

Пожалуйста, проверьте ваш xml, кажется, что это эти специальные символы ( &, <,> )

После обсуждения с Вайбхавом Джани

Вот пример XML-файла

<?xml version="1.0"?>
<first_screen>
   <first_screen_object id="1">
      <name><![CDATA[मानक हिन्दी]]></name>
      <desc><![CDATA[मानक हिन्दीमानक हिन्दी मानक हिन्दी मानक हिन्दी मानक हिन्दी मानक हिन्दी मानक हिन्दी  मानक हिन्दी मानक हिन्दी मानक हिन्दी मानक हिन्दी]]></desc>
       </first_screen_object>

       <first_screen_object id="2">
      <name><![CDATA[मानक हिन्दी]]></name>
      <desc><![CDATA[मानक हिन्दीमानक हिन्दी मानक हिन्दी मानक हिन्दी मानक हिन्दी मानक हिन्दी मानक हिन्दी  मानक हिन्दी मानक हिन्दी मानक हिन्दी मानक हिन्दी]]></desc>
         </first_screen_object>


       <first_screen_object id="3">
      <name><![CDATA[मानक हिन्दी]]></name>
      <desc><![CDATA[मानक हिन्दीमानक हिन्दी मानक हिन्दी मानक हिन्दी मानक हिन्दी मानक हिन्दी मानक हिन्दी  मानक हिन्दी मानक हिन्दी मानक हिन्दी मानक हिन्दी]]></desc>
        </first_screen_object>

       </first_screen>

А это SAX-парсер для образца XML

import java.io.InputStream;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.sax.Element;
import android.sax.EndTextElementListener;
import android.sax.RootElement;
import android.util.Xml;

public class HindiParser {

    // Constructor
    public HindiParser() {

    }

    public static InputStream getInputStreamFromUrl(String url) {
        InputStream content = null;
        try {
            HttpGet httpGet = new HttpGet(url);
            HttpClient httpclient = new DefaultHttpClient();
            // Execute HTTP Get Request
            HttpResponse response = httpclient.execute(httpGet);
            content = response.getEntity().getContent();
        } catch (Exception e) {
            // handle the exception !
        }
        return content;
    }

    /*
     * <?xml version="1.0"?> <first_screen> <first_screen_object id="1">
     * <name><![CDATA[मानक हिन्दी]]></name> <desc><![CDATA[मानक हिन्दीमानक
     * हिन्दी मानक हिन्दी मानक हिन्दी मानक हिन्दी मानक हिन्दी मानक हिन्दी मानक
     * हिन्दी मानक हिन्दी मानक हिन्दी मानक हिन्दी]]></desc>
     * </first_screen_object>
     * 
     * <first_screen_object id="2"> <name><![CDATA[मानक हिन्दी]]></name>
     * <desc><![CDATA[मानक हिन्दीमानक हिन्दी मानक हिन्दी मानक हिन्दी मानक हिन्दी
     * मानक हिन्दी मानक हिन्दी मानक हिन्दी मानक हिन्दी मानक हिन्दी मानक
     * हिन्दी]]></desc> </first_screen_object> </first_screen_object>
     * 
     * 
     * <first_screen_object id="3"> <name><![CDATA[मानक हिन्दी]]></name>
     * <desc><![CDATA[मानक हिन्दीमानक हिन्दी मानक हिन्दी मानक हिन्दी मानक हिन्दी
     * मानक हिन्दी मानक हिन्दी मानक हिन्दी मानक हिन्दी मानक हिन्दी मानक
     * हिन्दी]]></desc> </first_screen_object>
     * 
     * </first_screen>
     */

    public void parse() {
        try {
            RootElement root = new RootElement("first_screen");
            Element firstScreenElemnet = root.getChild("first_screen_object");
            firstScreenElemnet.getChild("name").setEndTextElementListener(
                    new EndTextElementListener() {
                        public void end(String body) {
                            System.out.println("Name is " + body);
                        }
                    });
            firstScreenElemnet.getChild("desc").setEndTextElementListener(
                    new EndTextElementListener() {
                        public void end(String body) {
                            System.out.println("Description  is " + body);
                        }
                    });

            try {
                Xml.parse(
                        getInputStreamFromUrl("http://pastebin.com/raw.php?i=M6zrbJ0W"),
                        Xml.Encoding.UTF_8, root.getContentHandler());
            } catch (Exception e) {
                e.printStackTrace();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}
0 голосов
/ 15 апреля 2011

какую кодировку вы используете?

если вы используете ISO-8859-1, попробуйте использовать UTF-8

<?xml version="1.0" encoding="UTF-8"?>
...