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

然后就爆异常啦是吗? 然而并没有 结果也是很棒棒的修改啦
image

但是再次运行时就报错啦

image
对就是这种错,一脸懵逼的错。明明刚刚还是好好的;
然后去网上看大神:
image

大神说我是因为没关流 有道理查一波出错的源码:

image

好像是这个样子。
然后疯狂的关流,重启编译器
然而结果还是这个样子。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
原创粉丝点击