【问题标题】:Android SAX XML parsing errorAndroid SAX XML 解析错误
【发布时间】:2013-12-05 02:58:57
【问题描述】:

我正在尝试解析来自 http 请求的响应。这是我从那个响应中得到的字符串:

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://my-web-address.com/webservices/">&lt;NewDataSet&gt;
    &lt;Case&gt;
    &lt;ID&gt;260023277&lt;/ID&gt;
    &lt;CaseNumber&gt;8931-04-03&lt;/CaseNumber&gt;

     &lt;/Case&gt;

    .
    .
    .
    &lt;/NewDataSet&gt;</string>

所有元素(用点表示)都是有效的。
以下是我使用 sax 解析此 xml 的方式:

        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();

        InputSource inputSource = new InputSource( new StringReader( responce ) ); // responce is my String containing XML.
        CasesParser myXMLHandler = new CasesParser();
        xr.setContentHandler(myXMLHandler);
        xr.parse(inputSource);

CaseParser 类扩展DefaultHandler 并以常规方式实现所有功能。

所以确切的错误是解析器没有检测到“字符串”元素以外的任何东西。它在CaseParserstartElement() 方法中检测到它,然后也在endElement() 方法中检测到它。解析器在两者之​​间没有找到其他元素。
在检索“字符串”的值时,我只得到 '&lt;' 字符。没有其他的。

可能是什么问题?

【问题讨论】:

    标签: android xml xml-parsing sax saxparser


    【解决方案1】:

    你的主要问题是所有的 xml 标签都被转义了,这使得它们不是真正的 xml 标签。

    如果可能,您可能想与制作此文件的人交谈,并让他们更改它,以免这些数据被转义。

    如果无法获得更好的数据,您可能需要将&lt;string&gt; 标记的所有内容读入一个字符串,然后启动另一个解析器来解析该字符串的内容,第一个解析器将拥有该内容未转义。

    如果您得到的只是一个'&lt;' 字符,那么您可能犯了一个常见错误,即期望characters 方法只被调用一次。它可以被多次调用,需要将数据收集到一个缓冲区中,然后在endElement方法中将其转换为字符串。

    包含此收集逻辑的示例代码,请参阅my answer to a related question

    一旦你正确解析了&lt;string&gt;标签的所有内容到JavaString中,你需要使用该字符串作为另一个解析的内容。

    【讨论】:

      【解决方案2】:

      这是我根据唐的回答得到的解决方法。
      我使用 XMLPullParser 解析了 &lt;string&gt; 标记内的内容,将响应存储在一个字符串中,然后输入该字符串(现在是没有 &lt;string&gt; 标记的 XML)
      如果有人遇到同样的问题,这里有一个小示例:

        XmlPullParserFactory factory = null;
            String parsed = "";
      
               try {
                   factory = XmlPullParserFactory.newInstance();
                   factory.setNamespaceAware(true);
                   XmlPullParser xpp = factory.newPullParser();
                  xpp.setInput(new StringReader (responce));
                  int eventType = xpp.getEventType();
                   while (eventType != XmlPullParser.END_DOCUMENT) {
                    if(eventType == XmlPullParser.START_DOCUMENT) {
                        Log.d(Constants.TAG,"Start document");
                    } else if(eventType == XmlPullParser.END_DOCUMENT) {
                        Log.d(Constants.TAG,"End document");
                    } else if(eventType == XmlPullParser.START_TAG) {
                        Log.d(Constants.TAG,"Start tag "+xpp.getName());
                    } else if(eventType == XmlPullParser.END_TAG) {
                        Log.d(Constants.TAG,"End tag "+xpp.getName());
                    } else if(eventType == XmlPullParser.TEXT) {
                        Log.d(Constants.TAG,"Text "+xpp.getText());
                        parsed = xpp.getText();
                    }
                    eventType = xpp.next();
                   }
              } catch (Exception e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              }
               xmlResponse = parsed;  
      

      所以从这里开始,我将xmlResponse 对象输入到我的CaseParser 对象中,该对象已经编写用于处理和存储我的对象中的xml。
      希望它也对其他人有所帮助。干杯!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-16
        • 1970-01-01
        • 2011-04-30
        • 2012-03-12
        • 2013-01-02
        • 1970-01-01
        • 1970-01-01
        • 2011-09-23
        相关资源
        最近更新 更多