XML是一种扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML使用DTD(document type definition)文档类型定义来组织数据;格式统一,跨平台和语言,早已成为业界公认的标准。
XML是标准通用标记语言 (SGML) 的子集,非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。
我用JSON从客户端传输文件到客户端使用起来的简洁度和开发速度要甩xml几条街,XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了,并且xml解析什么父节点子节点搞得我头晕眼花的,最过分的是解析xml方式还有好多种,那么问题来了,解析xml文件到底哪家强?答案就是DOM4J,DOM4J 是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML,我看到dom创建的树结构,什么追加节点属性,对我这种菜鸟十分的不友好,而DOM4J就和json有点相似了,创建根节点元素–根据根节点元素创建子节点元素–根据子节点元素添加属性–根据子节点元素添加子子节点元素,该用addElement用addElement,该用addAttribute用addAttribute,最接近汉语的思维。
下面放个例子供大家参考:只需要引入dom4j-jar包就可以了

package org.web.service;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/**
 * DOM4J解析与生成XML文档
 */
public class TestDOM4J {
    //利用dom4j进行xml文档的写入工作
    public void creatXml(File file){
       // 使用DocumentHelper类创建文档实例(生成 XML文档节点的 dom4j API工厂类)  
       Document doc = DocumentHelper.createDocument();
       //使用addElement()方法创建根元素 student
       Element root = doc.addElement("students");
       //在根元素中使用addComment()方法添加注释
       root.addComment("hello xml");
       //在根元素中使用addProcessingInstruction()方法增加一个处理指令
       root.addProcessingInstruction("target", "text");
       //在根元素中使用addElement()方法增加studeng元素
       Element student = root.addElement("student");
       //使用addAttributes()方法向student元素添加id和name属性
       student.addAttribute("id", "1");
       student.addAttribute("name", "lightTrace");

       //向student元素中添加sex元素,上面的id和name是作为student的属性添加进去的,而sex是作为元素添加进来的,就是看想添加什么就对应的用什么方法
       Element sex = student.addElement("sex");
       //使用setText()方法设置sex元素的文本
       sex.setText("m");
       //在student元素中增加age元素,并设置该元素的文本
       Element age = student.addElement("age");
       //和上面一样设置该元素的文本
       age.setText("25");

       //在根元素中使用addElement方法增加student元素
       Element student2 = root.addElement("student"); 
       //使用addAttributes()方法向student元素添加id和name属性
       student2.addAttribute("id", "2");
       student2.addAttribute("name", "sureSand");
       //向student元素中添加sex、age元素
       Element sex2 = student2.addElement("sex");
       Element age2 = student2.addElement("age"); 
       //使用setText()方法设置sex、age元素的文本
       sex2.setText("w");
       age2.setText("18");

       //可以使用addDocType()方法添加文档说明
       //document.addDocType("students",null,"file://D://Dtds/dom4j.dtd")

       try {
           XMLWriter output =new XMLWriter(new FileWriter(file));
           output.write(doc);
           output.close();
       }catch(IOException e){
           System.out.println(e.getMessage());
       }
    }
    /**
     * 利用dom4j进行xml文件的读取操作
     */
    public void parseXml(File file){
        Document doc = null;
        //使用SAXReader解析XML文档catalog.xml
        SAXReader saxReader = new SAXReader();
        try {
            doc = saxReader.read(file);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //将字符串转为xml
        //document = DocumentHepler.parseText(fileString);

        //获取根节点
        Element root = doc.getRootElement();
        //获取根节点下的子节点遍历
        Iterator<?> iter = root.elementIterator("student");
        //遍历student节点
        while(iter.hasNext()){
            //获取当前子节点
            Element stu = (Element)iter.next();
            System.out.println("<"+stu.getName()+">");

            //获取当前子节点的属性遍历
            Iterator<?> attrList = stu.attributeIterator();
            while(attrList.hasNext()){
                Attribute attr = (Attribute) attrList.next();
                System.out.println(attr.getName()+"="+attr.getValue());
            }
            //遍历student节点下所有子节点
            Iterator<?> stuIte = stu.elementIterator();
            while(stuIte.hasNext()){
                Element ele = (Element)stuIte.next();
                System.out.println("<"+ele.getName()+">"+ele.getTextTrim());
            }
            //获取student节点下的子节点sex值
            //String sex = stu.elementTextTrim("sex");
        }
        System.out.println("</"+root.getName()+">");

    }
    public static void main(String[] args) {  

        TestDOM4J dom4j = new TestDOM4J();  
        File file = new File("e:/dom4j.xml");  
//         dom4j.creatXml(file);;  

        dom4j.parseXml(file);;  

    }  
}