欢迎使用CSDN-markdown编辑器

来源:互联网 发布:网络星期一 2015 编辑:程序博客网 时间:2024/06/16 22:07

XML 作为一种常用的数据存储文件,常用于项目的配置文件。网络上各种关于XML文件解析的文档,大多关注在xml文件解析上,并且写的很详细。如果把xml比作数据库中的表格,它也存在数据的“增删该查”。并且我们常用的xml在Java 中的解析方式有4种:Document、SAX、Jdom、Dom4j
在日常的开发中,作为一种必会的技能,在操作xml方面我们只需要熟练掌握一种,了解其它就好。下面本人介绍一下Jdom 关于XML 文档的生成中常遇到小问题。
1.标签值为空,xml用双标签标注
默认情况下Jdom生成Xml 的格式如下:
这里写图片描述

即:标签值为空,使用单标签加反斜线表示
解决:

        // 生成上图Xml 的代码        String xmlFilePath="D:\\students.xml";        Document doc = new  Document();        Element root = new Element("students");        Element student = new Element("student");        Element name = new Element("name");        name.setAttribute("id", "s1");        name.setText("phda");        Element sex = new Element("sex");                sex.setText("");        student.addContent(name);        student.addContent(sex);        root.addContent(student);        doc.addContent(root);        this.writeXml(doc, xmlFilePath);

格式化输出xml 方法:writeXml(Document doc ,String xmlFilePath)

    public void writeXml(Document doc ,String xmlFilePath){         try {            FileOutputStream fos =                     new FileOutputStream(new File(filepath));            Format format = Format.getRawFormat();            format.setEncoding("UTF-8");//设置编码            format.setIndent(" ");//换行、缩进字符            XMLOutputter XMLOut = new XMLOutputter();            XMLOut.setFormat(format);            XMLOut.output(doc, fos);            fos.close();//关闭文件输出流        } catch (FileNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }

执行结果:
这里写图片描述

注:保证双标签sex的关键是:
1.1标签值为空时设置空字符sex.setText(“”);
1.2换行缩进方式设置为:format.setIntent(” “);// 注意空格

弊端:这种换行缩进的方式设置,导致xml文档中换行缩进处多出许多空格。这些空格也属于Document的内容,可以通过root.getContent();输出显示出来;
再次操作生成的Document 时格式会变得很难看,如下图:
这里写图片描述
[这是操作上述xml ,向xml 中添加新元素student 后重新调用writeXml 方法生成xml文件截图]

解决:调用writeXml方法前取出多余空格;
根据以前的Document中的Element 树生成新的树:

private void cloneRoot(Element newRoot,Element root){        List<Element> childList = root.getChildren();        if(childList.size()>0)        {                for(Element e:childList){//这是从孩子接                    Element newElement = new Element(e.getName());                    if(e.getChildren().size()<=0){//设置元素的值                        String text =e.getText();                        if(text==null)                            text="";                        newElement.setText(text);                    }                    newRoot.addContent(newElement);//添加                    this.cloneDoc(newElement,e);                }        }    }

[获得新的Root,重新设置Docuemnt: doc.setRootElement(newRoot); 然后在调用writeXml方法生成xml文档]

0 0
原创粉丝点击