当性反应包括印地文或其他特殊字符的SAXParser失败或其他、特殊字符、性反应、印地

2023-09-07 16:42:00 作者:回到原点,却回不到原来

我使用SAX解析器解析一个XML响应,但它抛出一个异常。

ExpatParser $ ParseException的:(不规范)无效标记

有没有什么解决办法吗?

下面是我的code:

 的HttpParams PARAMS =新BasicHttpParams();
    HttpProtocolParams.setContentCharset(PARAMS,UTF-8);
    HttpPost的PostMethod =新HttpPost(MyRequestURL);

    DefaultHttpClient HC =新DefaultHttpClient(PARAMS);

    postMethod.setEntity(新UrlEn codedFormEntity(namevaluepairs中));
    ResponseHandler的<字符串> RES =新BasicResponseHandler();
    字符串响应= hc.execute(postMethodURL,RES);


    ByteArrayInputStream的ByteArrayInputStream进行=
        新ByteArrayInputStream的(response.getBytes(UTF-8));

    / *从的SAXParserFactory的SAXParser。 * /
    的SAXParserFactory SPF = SAXParserFactory.newInstance();
    的SAXParser藻= spf.newSAXParser();

    / *获取我们创建的SAXParser的XMLReader的。 * /
    XMLReader的XR = sp.getXMLReader();

    / *创建一个新的ContentHandler,并将其应用到XML阅读器* /
    MyHandler的objHandler = MyHandler的新();
    xr.setContentHandler(objHandler);

   的InputSource的InputSource =新的InputSource(ByteArrayInputStream的);
   inputSource.setEncoding(UTF-8);

   / *从我们的网址解析XML数据。 * /

   xr.parse(InputSource的);

   / *解析完成。 * /
 

解决方案

第一个答案

&符号(&安培; )和左尖括号(< )不能出现在XML输出​​在他们的文字形式,除非标记使用时分隔符,或在注释,处理指令,或 CDATA 部分。如果在其他地方需要,他们必须用数字字符引用或字符串转义&安培; 和< 分别

右尖括号(> )可以重新presented使用字符串&放大器; GT ;,而且必须为兼容性,使用转义无论是&放大器; GT ;或者当它出现在字符串中的字符引用]]> 的内容,当该字符串不标志着一个结束< STRONG> CDATA 部分。

2020 12 01

请检查您的XML似乎说到了这些特殊字符(&功放;,&LT;> )

与Vaibhav的贾尼

经过讨论

下面是示例XML文件

 &LT; XML版本=1.0&GT?;
&LT; first_screen&GT;
   &所述; first_screen_object的id =1&GT;
      &LT;名称&gt;&LT;![CDATA [मानकहिन्दी]]&GT;&LT; /名称&gt;
      &LT;说明&GT;&LT;![CDATA [मानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दी]]&GT;&LT; /说明&GT;
       &LT; / first_screen_object&GT;

       &所述; first_screen_object的id =2&GT;
      &LT;名称&gt;&LT;![CDATA [मानकहिन्दी]]&GT;&LT; /名称&gt;
      &LT;说明&GT;&LT;![CDATA [मानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दी]]&GT;&LT; /说明&GT;
         &LT; / first_screen_object&GT;


       &所述; first_screen_object的id =3&GT;
      &LT;名称&gt;&LT;![CDATA [मानकहिन्दी]]&GT;&LT; /名称&gt;
      &LT;说明&GT;&LT;![CDATA [मानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दी]]&GT;&LT; /说明&GT;
        &LT; / first_screen_object&GT;

       &LT; / first_screen&GT;
 

这SAX解析器的示例XML

 进口的java.io.InputStream;
进口org.apache.http.Htt presponse;
进口org.apache.http.client.HttpClient;
进口org.apache.http.client.methods.HttpGet;
进口org.apache.http.impl.client.DefaultHttpClient;
进口android.sax.Element;
进口android.sax.EndTextElementListener;
进口android.sax.RootElement;
进口android.util.Xml;

公共类HindiParser {

    //构造函数
    公共HindiParser(){

    }

    公共静态的InputStream getInputStreamFromUrl(字符串URL){
        InputStream的内容= NULL;
        尝试 {
            HTTPGET HTTPGET =新HTTPGET(URL);
            HttpClient的HttpClient的=新DefaultHttpClient();
            //执行HTTP GET请求
            HTT presponse响应= httpclient.execute(HTTPGET);
            内容= response.getEntity()的getContent()。
        }赶上(例外五){
            //处理异常!
        }
        返回的内容;
    }

    / *
     *所述;?xml的版本=1.0&GT?; &LT; first_screen&GT; &所述; first_screen_object的id =1&GT;
     *&LT;名称&gt;&LT;![CDATA [मानकहिन्दी]]&GT;&LT; /名称&gt; &LT;说明&GT;&LT;![CDATA [मानकहिन्दीमानक
     *हिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानक
     *हिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दी]]≥&所述; /递减&GT;
     *&LT; / first_screen_object&GT;
     *
     *所述; first_screen_object的id =2&GT; &LT;名称&gt;&LT;![CDATA [मानकहिन्दी]]&GT;&LT; /名称&gt;
     *&LT;说明&GT;&LT;![CDATA [मानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दी
     *मानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानक
     *हिन्दी]]≥&所述; /递减&GT; &LT; / first_screen_object&GT; &LT; / first_screen_object&GT;
     *
     *
     *所述; first_screen_object的id =3&GT; &LT;名称&gt;&LT;![CDATA [मानकहिन्दी]]&GT;&LT; /名称&gt;
     *&LT;说明&GT;&LT;![CDATA [मानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दी
     *मानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानकहिन्दीमानक
     *हिन्दी]]≥&所述; /递减&GT; &LT; / first_screen_object&GT;
     *
     *&LT; / first_screen&GT;
     * /

    公共无效解析(){
        尝试 {
            rootElement的根=新rootElement的(first_screen);
            元件firstScreenElemnet = root.getChild(first_screen_object);
            firstScreenElemnet.getChild(名)。setEndTextElementListener(
                    新EndTextElementListener(){
                        公共无效结束(字符串体){
                            的System.out.println(名称是+体);
                        }
                    });
            firstScreenElemnet.getChild(DESC)。setEndTextElementListener(
                    新EndTextElementListener(){
                        公共无效结束(字符串体){
                            的System.out.println(描述为+体);
                        }
                    });

            尝试 {
                Xml.parse(
                        getInputStreamFromUrl(http://pastebin.com/raw.php?i=M6zrbJ0W),
                        Xml.Encoding.UTF_8,root.getContentHandler());
            }赶上(例外五){
                e.printStackTrace();
            }

        }赶上(例外五){
            e.printStackTrace();
        }

    }

}
 

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

解决方案

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 " &gt; ", and MUST, for compatibility, be escaped using either " &gt; " 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();
        }

    }

}