本文重点两点:1.再一次解析一个xml,验证之前的理解。 2. 发现endElement内最后一定要 currentTag = null
------------------------------------------------------------------------------------------------------------------
注意:一定要在endElement内最后currentTag = null .
原因:如前一篇所讲,对于非根节点(eg :<name>),在经历 startElement(currentTag = name) , characters (currentTag = name , currentValue = "刘德华") , endElement()后,还会触发一次 characters 。
所以,1. 若endElement内不currentTag = null 的话,那endElement后的currentTag 还是 “name” , 然后再触发一次 characters ,但此时 characters 内的 new String (ch , start ,length) 是空值,不是之前第二步的"刘德华",这样的话本来在第二步中已经赋值的 name = 刘德华 ,会在第四步中 name = 空。
2. 若endElement内最后 设置currentTag = null , 则 触发第四步 characters时,原来在第二步已经被保存的name = "刘德华" 就不会被 更新为 空值。因为根据characters内的判断条件可知,currentTag = 空时不进行操作。
总结一句话:在解析一个node节点结束标签(例如</name>)时,会触发endElement和characters方法,要在endElement方法内,将currentTag = null .
(本例中可以把 endElement内最后的 currentTag = null 删除作为测试)
-----------------------------------------------------------------------------------------------------------------
student.xml
<?xml version="1.0" encoding="UTF-8"?>
<StudentInfo>
<student>
<name>刘德华</name>
<sex>男</sex>
<lesson>
<lessonName>Spring整合开发</lessonName>
<lessonScore>85</lessonScore>
</lesson>
<lesson>
<lessonName>轻量级J2EE应用开发</lessonName>
<lessonScore>95</lessonScore>
</lesson>
<lesson>
<lessonName>Ajax应用开发</lessonName>
<lessonScore>80</lessonScore>
</lesson>
</student>
<student>
<name>宋慧乔</name>
<sex>女</sex>
<lesson>
<lessonName>Spring整合开发</lessonName>
<lessonScore>80</lessonScore>
</lesson>
<lesson>
<lessonName>轻量级J2EE应用开发</lessonName>
<lessonScore>85</lessonScore>
</lesson>
<lesson>
<lessonName>Ajax应用开发</lessonName>
<lessonScore>90</lessonScore>
</lesson>
</student>
</StudentInfo>
程序运行结果:
name :宋慧乔
sex :女
Ajax应用开发=90
Spring整合开发=80
轻量级J2EE应用开发=85
-----------------------------------
name :刘德华
sex :男
Spring整合开发=85
轻量级J2EE应用开发=95
Ajax应用开发=80
-----------------------------------