我使用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 部分。
请检查您的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 " > ", 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();
}
}
}