博主是一个大四学生,于大二下学期和大三上学期自学java web,后在大三下和大四上因为考研荒废了很多技术知识,前段时间公布分数后没有考上研究生。于是决定利用20天的时间复习之前学习的java web知识,希望能赶上各学校春招的末班车。现在开此博客记录学习过程。
因为之前学习时看的是传智播客方老师的视频,感觉很不错,于是这次准备重新看一遍。
------------------------------------------------------正文分割------------------------------------------------------------------
刚才在看关于xml的知识,因为本科学习了html,所以感觉毫不费劲,只是中间出现了一个小插曲,.dtd约束文档必须保存为utf-8或者unicode格式的才能正确使用,不然会提示非法字符的警告。方老师自己写的xml解析工具(基于Mircosoft.XMLDOM)应该也可以被淘汰了,仅对ie有用,不过有点强迫症把代码粘贴如下:
(注:以下代码写在head标签中)
<!--创建xml文档解析器对象 -->
var xmldoc = new ActiveXObject("Microsoft.XMLDOM");
<!--开启xml校验-->
xmldoc.validateOnParse = "true";
<!--装载xml文档-->
xmldoc.load("book.xml");
<!--获取打印错误信息-->
document.write(xmldoc.parseError.reason);
document.write(xmldoc.parseError.line);
看完视频发现dtd也过时了,学习目标就是能对照对着w3school的文档写出正确的xml,知识点就是属性,实体设计,没啥特别的。
接下来就是XML的解析方式,视频里讲的是DOM和SAX,其中最大的区别就是SAX解析速度快,对内存占用少,只适合来查找数据,修改删除添加都不行,dom实现crud很方便,但是不适于大文件.XML解析器最骚的就是dom4j。
第一天的任务是根据老师做的部分项目,做出完整项目,就是jaxp的增删查,查找的时候出了点问题,Node的getChildNodes()方法会因为XML文档不同子节点间换行而取到#text这个节点,很奇怪,而且我的程序一直无法取出节点的值。先把它贴出来,看有没有大神能看见,帮忙解答。
public Student find(String examid) throws ParserConfigurationException, SAXException, IOException{
Document document = XmlUtils.getDoucment();
NodeList list = document.getElementsByTagName("student");
int index = -1;
for(int i=0;i<list.getLength();i++){
if(list.item(i).getAttributes().getNamedItem("examid").getNodeValue().equals(examid)){
index = i;//可以改为getAttribute("examid");
}
}
NodeList childNodes = list.item(index).getChildNodes();
//取孩子节点的可以直接list.utem(index).getElementsByTagName("name");等等
String name = childNodes.item(0).getNodeValue();
String location = childNodes.item(1).getNodeValue();
double grade = Double.parseDouble(childNodes.item(2).getNodeValue());
//这三处的getNodeValue()换成getTextContent()就OK了
String idcard = list.item(index).getAttributes().getNamedItem("idcard").getNodeValue();
//System.out.println(name);
Student student = new Student();
student.setName(name);
student.setGrade(grade);
student.setLocation(location);
student.setIdcard(idcard);
return student;
}
今天还是很充实的,很晚了,睡觉啦。
-------------------------------------十分钟后修订
刚才因为没解决问题很不爽,不能耻辱下机,于是乎又找了找问题的所在,终于找到了解决方法,原来
getNodeValue()和getTextContent()的区别是出问题的地方!!!!!!!
前者对于Node中的getNodeValue()方法只对Attribute,Text,Comment,CDATA等节点有意义,其他取出来都是null,而getTextContent()方法则返回此节点及其后代的文本内容。
终于明白了,气死我了,但是还是积累颇多!