当响应包含印地语或其他特殊字符时,SAXParser 失败

发布于 2024-11-01 11:00:43 字数 1296 浏览 0 评论 0原文

我正在使用 SAX 解析器来解析 XML 响应,但它抛出异常。

ExpatParser$ParseException:(格式不正确)无效令牌

有什么解决方案吗?

这是我的代码:

    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. */ 

I am using SAX parser to parse a XML response but it throws an exception.

ExpatParser$ParseException : (not well formed) invalid token

Is there any solution?

Here is my code:

    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. */ 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

極樂鬼 2024-11-08 11:00:43

我不完全确定它会解决您的问题,但我会使用其 setEncoding() 方法在 InputSource 上设置字符集。

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

xr.parse(inputSource);

I'm not entirely sure that it will solve your problem but I'd set the charset on the InputSource using its setEncoding() method.

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

xr.parse(inputSource);
我不是你的备胎 2024-11-08 11:00:43

尝试使用 android.util.Xml.parse()
第一个参数InputStream => HttpResponse.getEntity().getContent()
第二个参数 Xml.Encoding => Xml.Encoding.UTF_8
最后一个参数 ContentHandler =>你的经纪人

Try with android.util.Xml.parse()
First argument InputStream => HttpResponse.getEntity().getContent()
Second argument Xml.Encoding => Xml.Encoding.UTF_8
Last argument ContentHandler => your handler

彡翼 2024-11-08 11:00:43

这应该可以解决问题:

InputSource inputSource = new InputSource(is);
inputSource.setEncoding("ISO-8859-1");

This should solve the problem:

InputSource inputSource = new InputSource(is);
inputSource.setEncoding("ISO-8859-1");
百思不得你姐 2024-11-08 11:00:43

第一个答案 &

符号 (&) 和左尖括号 (<) 不得以其文字形式出现在 xml 输出中,除非用作标记分隔符,或在注释、处理指令或 CDATA 部分中使用。如果其他地方需要它们,则必须分别使用数字字符引用或字符串“ & ”和“< ”对它们进行转义。

右尖括号 (>) 可以使用字符串“>;”表示,并且为了兼容性,必须使用“&”进行转义;gt; 或出现在内容中的字符串“ ]]> ”中的字符引用,且该字符串未标记 CDATA部分。

请检查您的 xml 是否包含这些特殊字符(&,<,>

与 Vaibhav Jani 讨论后

这是示例 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>

这是示例 XML 的 SAX 解析器

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

    }

}

First Answer

The ampersand character (&) and the left angle bracket (<) MUST NOT appear in your xml output in their literal form, except when used as markup delimiters, or within a comment, a processing instruction, or a CDATA section. If they are needed elsewhere, they must be escaped using either numeric character references or the strings " & " and "< " respectively.

The right angle bracket (>) may be represented using the string " >; ", and MUST, for compatibility, be escaped using either " >; " or a character reference when it appears in the string " ]]> " in content, when that string is not marking the end of a CDATA section.

Please check your xml seems that it comes the these special characters(&,<,>)

After discussion with Vaibhav Jani

Here is the sample xml file

<?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>

And this the SAX parser for the sample 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();
        }

    }

}
天暗了我发光 2024-11-08 11:00:43

你使用什么编码?

如果您使用 ISO-8859-1,请尝试使用 UTF-8

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

what encoding are you using?

if you are using ISO-8859-1, try using UTF-8

<?xml version="1.0" encoding="UTF-8"?>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文