我正在使用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. */
答案 0 :(得分:1)
我不完全确定它会解决您的问题,但我会使用InputSource
方法在setEncoding()
上设置字符集。
InputSource inputSource = new InputSource(byteArrayInputStream);
inputSource.setEncoding("UTF-8");
xr.parse(inputSource);
答案 1 :(得分:1)
尝试使用android.util.Xml.parse()
第一个参数InputStream =&gt; HttpResponse.getEntity()的getContent()
第二个参数Xml.Encoding =&gt; Xml.Encoding.UTF_8
最后一个参数ContentHandler =&gt;你的处理程序
答案 2 :(得分:1)
这应该可以解决问题:
InputSource inputSource = new InputSource(is);
inputSource.setEncoding("ISO-8859-1");
答案 3 :(得分:0)
如果您使用的是ISO-8859-1,请尝试使用UTF-8
<?xml version="1.0" encoding="UTF-8"?>
答案 4 :(得分:0)
第一个答案
&符号(&amp; )和左尖括号(&lt; )绝不能以文字形式出现在xml输出中,除非用作标记分隔符,或注释,处理指令或 CDATA 部分。如果在其他地方需要它们,则必须分别使用数字字符引用或字符串“&amp; ”和“&lt; ”进行转义。
右尖括号(&gt; )可以使用字符串“&amp; gt ;”来表示,为了兼容性,必须使用“<}来转义strong>&amp; gt ;“或字符串引用,当它出现在字符串”]]&gt; “内容中时,该字符串未标记的结尾CDATA 部分。
请检查您的xml似乎是这些特殊字符(&amp;,&lt;,&gt; )
与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();
}
}
}