我正在创建一个应用程序,该应用程序将为员工带来整个指纹考勤注册数据,其中包括:日期,时间,日期。我通过SOAP
服务加载这些数据,它返回一个包含XML
布局数据的字符串文件,并将其转换为相同类型但具有不同数据的对象,然后使用ArrayList
将这些对象添加到SAXParser
中。我成功实现了SAXParser
-我所认为的-并且可以确定这一点,因为我已经提取了许多对象并将其添加到ArraryList
中。问题是,每次成功添加62个对象时,SAXParser
突然为第二个属性“ TIME”提供一个空值,并停止向ArrayList
添加新对象。起初我以为是由于XML
中的某些问题,但是由于它是每天的签入和签出,所以我注意到对于最新显示的每个新寄存器,都会删除ArrayList
中最旧的对象。然后,它将在添加62个对象并读取“ DATE”属性之后完全停止读取XML,然后为“ TIME”属性提供空白值并停止读取。尽管其余应用程序运行正常,并且将ArrayList
与RecyclerView
链接没有问题。但是我想添加所有对象,不仅是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
或任何其他部分。我通过调试进行了检查,当ch
中的SAXParser
数组在XML中捕获第63个对象的DATE并对其进行分配时,但是当涉及第63个对象的TIME时,它将为字符串msg
分配一个空值并跳过SAXParser
的其余过程。我无法检测到任何实际错误。我该怎么办?我错过了什么? 最佳答案
允许SAX解析器在characters()
方法的多次调用中传递字符数据,并且将数据的不同部分串联起来是您的工作。它可以随心所欲地拆分它。您的characters()
方法仅保留传递的最后一部分。