==== 在使用dom4j解析一个xml文档读取xml中数据时突然爆出一个这个异常。思虑良久终于攻克,特写此博客以示庆祝。菜鸟自(。・∀・)ノ゙嗨,不喜勿啄。如有大神指点,请上座!
情况是这样的,在学习xml解析时,使用啦传说中最好的解析xml解析方式Dom4j;
xml是这样的:
<?xml version="1.0" encoding="utf-8" ?>
<书架>
<书>
<书名>数据结构</书名>
<作者>严蔚敏</作者>
<售价>29.00元</售价>
</书>
<书>
<书名>高等数学</书名>
<作者>同济大学数学系</作者>
<售价>55.00元</售价>
</书>
</书架>
刚开始解析一下打印,很棒棒
@Test
public void select() {
try {
SAXReader reader = new SAXReader();
Document dom = reader.read(path);
Element root = dom.getRootElement();
Element book = root.element("书");
Element bookName = book.element("书名");
System.out.println(bookName.getTextTrim());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
结果正常输出啦:数据结构
光能看有什么用,于是想着修改一下,于是有啦下面的代码:
@Test
public void add(){
try{
SAXReader reader = new SAXReader();
Document dom = reader.read(path);
Element root = dom.getRootElement();
Element book = root.element("书");
Element price = DocumentHelper.createElement("特价");
price.setText("9.9元");
//将特价节点挂载到第一本书上
book.add(price);
// 将更新后的document对象再写会xml文件中
//FileWriter out = new FileWriter(path);//字符使用默认的编码gbk
FileOutputStream out = new FileOutputStream(path);
//使用转换流将字节流转成字符流 并且使用utf-8这个码表
OutputStreamWriter osw = new OutputStreamWriter(out,"utf-8");
XMLWriter writer = new XMLWriter();
writer.write(dom);
writer.close();
}catch(Exception e) {
e.printStackTrace();
}
}
@Test
然后就爆异常啦是吗? 然而并没有 结果也是很棒棒的修改啦
但是再次运行时就报错啦
对就是这种错,一脸懵逼的错。明明刚刚还是好好的;
然后去网上看大神:
大神说我是因为没关流 有道理查一波出错的源码:
好像是这个样子。
然后疯狂的关流,重启编译器
然而结果还是这个样子。xml文件照常提前结束。
再搜。有的说是xml里有中文的缘故。。。。。不扯淡吗 xml里有中文怎么啦,对堂堂十四亿的人口搞偏见,不可能的事然后自己追根溯源去排查终于功夫不负有心人
错误给我找到啦
原来是错误出错在xml文件中,当xml进行一次读写后重新写入的xml的格式会发生一些变化,我的就是写入的时候被多加啦个换行符。
<?xml version="1.0" encoding="utf-8" ?>
<!--这里如果多一些换行符,文件从开后读 读到换行符会默认结束,这样你的程序就什么都没读到,然后就报错啦-->
<书架>
<书>
<书名>数据结构</书名>
<作者>严蔚敏</作者>
<售价>29.00元</售价>
</书>
<书>
<书名>高等数学</书名>
<作者>同济大学数学系</作者>
<售价>55.00元</售价>
</书>
</书架>
解决方法就是重构xml文档,其实代码也有点错,漏啦一些东西;正因为漏啦这东西才爆的异常,让我涨啦带你见识。正确代码是:
SAXReader reader = new SAXReader();
Document dom = reader.read(path);
Element root = dom.getRootElement();
Element book = root.element("书");
Element price = DocumentHelper.createElement("特价");
price.setText("9.9元");
//将特价节点挂载到第一本书上
book.add(price);
// 将更新后的document对象再写会xml文件中
//FileWriter out = new FileWriter(path);//字符使用默认的编码gbk
FileOutputStream out = new FileOutputStream(path);
//使用转换流将字节流转成字符流 并且使用utf-8这个码表
OutputStreamWriter osw = new OutputStreamWriter(out,"utf-8");
XMLWriter writer = new XMLWriter(osw);
writer.write(dom);
writer.close();
### 下次再爆这种异常记得查看xml文件是否正常先!
gantt
dateFormat YYYY-MM-DD
section S1
T1: 2014-01-01, 9d
section S2
T2: 2014-01-11, 9d
section S3
T3: 2014-01-02, 9d
“`