org.xml.sax.SAXParseException:解析XML时出现意外的标记

更新: –似乎我必须提供返回xml的URL。 这是 – URL


我在解析xml时遇到了SAXParseException。 我试图解析的xml如下 –

        

我用来解析这个xml的代码如下 –

 public Document getDomElement(String xml) { Document doc = null; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { DocumentBuilder db = dbf.newDocumentBuilder(); InputSource is = new InputSource(); is.setCharacterStream(new StringReader(xml)); doc = db.parse(is); } catch (ParserConfigurationException e) { e.printStackTrace(); Log.e("ParserConfigurationException: ", e.getMessage()); return null; } catch (SAXException e) { e.printStackTrace(); Log.e("SAXException: ", e.getMessage()); return null; } catch (IOException e) { e.printStackTrace(); Log.e("IOException: ", e.getMessage()); return null; } return doc; } 

我使用相同的代码来解析其他xml数据,它的工作原理。 我无法理解这个xml数据中有什么阻止它正确地解析数据。 我也在线检查了许多xmlvalidation器的xml。

我必须在这里遗漏一些明显的东西。

编辑: –我试图解析的xml来自web服务(名称,地址等实际上不是空的)。 当我尝试通过代码本身硬编码直接使用xml时,它工作正常。 但是当试图直接从webservice响应中使用它时,对我来说不起作用。

例外: –

 10-09 20:39:50.328: W/System.err(16211): org.xml.sax.SAXParseException: Unexpected token (position:TEXT @1:2 in java.io.StringReader@41941010) 10-09 20:39:50.335: W/System.err(16211): at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:146) 10-09 20:39:50.335: W/System.err(16211): at com.blackcobrastudios.ukash.WebService.XMLDataParser.getDomElement(XMLDataParser.java:159) 10-09 20:39:50.335: W/System.err(16211): at com.blackcobrastudios.ukash.Manager.APICaller.processResult(APICaller.java:386) 10-09 20:39:50.335: W/System.err(16211): at com.blackcobrastudios.ukash.Manager.APICaller.access$1(APICaller.java:385) 10-09 20:39:50.335: W/System.err(16211): at com.blackcobrastudios.ukash.Manager.APICaller$SoapCaller.onPostExecute(APICaller.java:361) 10-09 20:39:50.335: W/System.err(16211): at com.blackcobrastudios.ukash.Manager.APICaller$SoapCaller.onPostExecute(APICaller.java:1) 10-09 20:39:50.335: W/System.err(16211): at android.os.AsyncTask.finish(AsyncTask.java:602) 10-09 20:39:50.343: W/System.err(16211): at android.os.AsyncTask.access$600(AsyncTask.java:156) 10-09 20:39:50.343: W/System.err(16211): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615) 10-09 20:39:50.343: W/System.err(16211): at android.os.Handler.dispatchMessage(Handler.java:99) 10-09 20:39:50.343: W/System.err(16211): at android.os.Looper.loop(Looper.java:137) 10-09 20:39:50.343: W/System.err(16211): at android.app.ActivityThread.main(ActivityThread.java:4536) 10-09 20:39:50.343: W/System.err(16211): at java.lang.reflect.Method.invokeNative(Native Method) 10-09 20:39:50.351: W/System.err(16211): at java.lang.reflect.Method.invoke(Method.java:511) 10-09 20:39:50.351: W/System.err(16211): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 10-09 20:39:50.351: W/System.err(16211): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558) 10-09 20:39:50.351: W/System.err(16211): at dalvik.system.NativeStart.main(Native Method) 10-09 20:39:50.351: E/SAXException:(16211): Unexpected token (position:TEXT @1:2 in java.io.StringReader@41941010) 

问题在于编码。 以下答案正确解释 –

https://stackoverflow.com/a/2869127/1079901

我只需要在响应字符串上调用此正则表达式 –

 response = response.replaceAll("[^\\x20-\\x7e]", ""); 

感谢BalusC提供了如此完美的答案。

我建议放弃sax解析器并使用Android官方支持的XMLPullParser 。 Android Gingerbread(2.3.3)后不支持Sax解析器

我建议您在运行代码之前尝试在程序中加入一些XSDvalidation。

以下内容可以帮助您:

  • 在线XSDvalidation工具: http : //www.utilities-online.info/xsdvalidation/
  • 适用于Android的Xerces: https : //code.google.com/p/xerces-for-android/

如果XML包含Unicode字符,如阿拉伯字母或波斯字母,则StringReader会产生exception。 在这些情况下,将InputStream直接传递给Document对象