【问题标题】:SAXParser gives me an empty value for the second tag after 62 element for no clear reason, why?SAXParser 在 62 元素之后给我一个空值,原因不明,为什么?
【发布时间】:2019-07-14 06:14:05
【问题描述】:

我正在创建一个应用程序,它可以为员工带来整个指纹考勤登记数据,其中包含:日期、时间、日期。我通过SOAP 服务加载这些数据,它返回一个包含XML 布局数据的字符串文件,并将其转换为相同类型但具有不同数据的对象,并使用SAXParser 将这些对象添加到ArrayList。我成功地实现了SAXParser——这就是我的想法——我可以确保这一点,因为我已经提取了许多对象并将其添加到ArraryList。问题是,每次成功添加 62 个对象时,SAXParser 突然为第二个属性“TIME”提供一个空值,并停止向ArrayList 添加新对象。起初我以为是因为XML 有问题,但由于是每日签到和签出,我注意到最迟每显示一个新的寄存器,ArrayList 中最旧的对象被删除。然后它恰好在添加 62 个对象并读取“DATE”属性后停止读取 XML,然后为“TIME”属性提供空白值并停止读取。尽管其余的应用程序运行良好,并且将ArrayListRecyclerView 链接起来没有问题。但我想添加所有对象,而不仅仅是 62。

我尝试调试以检查qName 值,当它是第 63 个对象“TIME”属性时,在数组 ch 中它显示“TIME”在那里,但是一旦将它分配给 String 变量,它就会变为空.

这是字符串xmlResponse,其中包含今天的XML 文件示例:

<LIST_ATTEND>
  <ATTEND> //First Object, the latest registered
    <DATE>2019/07/13</DATE>
    <TIME>08:17:49</TIME>
    <DAY>السبت</DAY>
  </ATTEND>
  <ATTEND> //Second Object
    <DATE>2019/07/12</DATE>
    <TIME>21:45:31</TIME>
    <DAY>الجمعة</DAY>
  </ATTEND>

...

<ATTEND> //62th Object, which the last object to be read completely
    <DATE>2019/05/23</DATE>
    <TIME>15:35:07</TIME>
    <DAY>الخميس</DAY>
  </ATTEND>
<ATTEND> //The 63th Object
    <DATE>2019/05/23</DATE>
    <TIME>10:42:40</TIME> //Here SAXParser gives an empty value, and skips all remaining
    <DAY>الخميس</DAY>
  </ATTEND>

...

<ATTEND> //Bottom of the list, oldest registered data
    <DATE>2019/03/03</DATE>
    <TIME>14:50:10</TIME>
    <DAY>الاحد</DAY>
  </ATTEND>
</LIST_ATTEND>

这里是实现SAXParser的java代码:


List<FingerprintAttendModel> fpmList = new ArrayList<>();
String xmlResponse = null;


void readXML(){
    if (xmlResponse != null){
        try{
            SAXParserFactory factory = SAXParserFactory.newInstance();
            factory.setNamespaceAware(true);
            SAXParser parser = factory.newSAXParser();
            parser.parse(IOUtils.toInputStream(xmlResponse), new DefaultHandler() {

                FingerprintAttendModel fpm;
                String msg;

                @Override
                public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
                    super.startElement(uri, localName, qName, attributes);
                    if (qName.equals("LIST_ATTEND")) {
                        fpmList.clear();
                    }
                    if (qName.equals("ATTEND")) {
                        fpm = new FingerprintAttendModel();
                    }
                }

                @Override
                public void characters(char[] ch, int start, int length) throws SAXException {
                    super.characters(ch, start, length);
                    msg = new String(ch, start, length); 
                }

                @Override
                public void endElement(String uri, String localName, String qName) throws SAXException {
                    super.endElement(uri, localName, qName);
                    if (qName.equals("DATE")) {
                        fpm.setDate(msg);
                    }
                    if (qName.equals("TIME")) {
                        fpm.setTime(msg);
                    }
                    if (qName.equals("DAY")) {
                        fpm.setDay(msg);
                        }
                    if (qName.equals("ATTEND")) {
                        fpmList.add(fpm);

                    }
                    if(qName.equals("LIST_ATTEND"))
                        xmlResponse = null;
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
    }

问题在于SAXParser,而不是fpmList 或任何其他部分。我通过调试检查,当SAXParser 中的ch 数组捕获XML 中第63 个对象的DATE 并正确分配它时,但是当涉及到第63 个对象的TIME 时,它为String msg 分配一个空值并跳过SAXParser 的剩余进程。我无法检测到任何实际错误。我该怎么办?我错过了什么吗?

【问题讨论】:

    标签: java android xml saxparser


    【解决方案1】:

    允许 SAX 解析器在多次调用 characters() 方法时传递字符数据,您的工作是连接数据的不同部分。它可以将它拆分到任何它喜欢的地方。您的 characters() 方法只保留传递的最后一部分。

    【讨论】:

      猜你喜欢
      • 2016-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多