org.dom4j.DocumentException 文件提前结束。 Nested exception 文件提前结束。
来源:互联网 发布:制作简单 进销存 软件 编辑:程序博客网 时间:2024/06/09 18:37
==== 在使用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
“`
阅读全文
0 0
- org.dom4j.DocumentException 文件提前结束。 Nested exception 文件提前结束。
- org.dom4j.DocumentException: Error on line -1 of document : 文件提前结束
- Cause: org.xml.sax.SAXParseException; 文件提前结束 && nested exception is java.lang.IllegalArgumentExc
- dom4j 读取文件异常 org.dom4j.DocumentException: Read timed out Nested exception: Read timed out
- fread函数读取文件提前结束
- org.dom4j.DocumentException: null Nested exception: null
- org.dom4j.DocumentException: null Nested exception: null
- org.dom4j.DocumentException: null Nested exception: null
- eclipse 启动项目org.xml.sax.SAXParseException; lineNumber: 18; columnNumber: 1; 文件提前结束
- Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 文件提前结束。
- Cause: org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 1; 文件提前结束。
- Dom4j (org.dom4j.DocumentException: c Nested exception: c.)
- Dom4j (org.dom4j.DocumentException: c Nested exception: c.)(转载)
- org.dom4j.DocumentException: www.hibernate.org Nested exception: www.hiberna
- x.SAXParseException; lineNumber: 1; columnNumber: 1; 文件提前结束。
- org.dom4j.DocumentException: Connection timed out: connect Nested exception
- org.dom4j.DocumentException: Connection timed out: connect Nested exception:
- org.dom4j.DocumentException: null Nested exception: null解决方法
- Unity中用自己做的方块(非标准cube)构建菱形地面
- mysql 结构优化
- Frogger POJ
- Mysql的存储过程实例
- 2017 08 11 小结
- org.dom4j.DocumentException 文件提前结束。 Nested exception 文件提前结束。
- 网易编程题--暗黑的字符串
- HPU 弱校联萌3 【1412】 QAQ & 君临天下 || 天行九歌
- 8-10 DAIRY
- 【深度学习】Ubuntu16.04下出现这个错误ImportError: No module named google.protobuf.internal
- python入门
- 多校联萌第三场H-StarFarming
- Linux系统环境下搭建SVN服务器
- Mac使用tree命令