org.dom4j.DocumentException 文件提前结束。 Nested exception 文件提前结束。


==== 在使用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
“`

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ripley_csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值