IT虾米网

Java生成xml四种方式详解

itxm 2021年07月21日 编程语言 207 0

四种方式生成xml文件:
DOM、SAX(Java提供)
JDOM、DOM4J(第三方提供)

DOM:

  1. 创建一个DocumentBuilderFactory对象,静态方法newInstance()
  2. 创建一个DocumentBuilder对象,DocumentBuilderFactory实例的newDocumentBuilder()方法
  3. 通过DocumentBuilder对象调用newDocument方法,返回一个Document对象
  4. 通过Document对象调用creatElement方法,创建一个节点元素,返回Element对象
    通过Element对象的appendChild方法向该元素添加子元素
    通过Element对象的setAttribute方法,给元素添加属性
    ……
  5. 通过TransformerFactory的静态方法newInstance(),创建TransformerFactory对象
  6. 通过TransformerFactory的newTransformer(),创建Transformer对象
  7. Transformer对象的setOutputProperty(OutputKeys.INDENT,”yes”)方法可以用来换行(可选)
  8. 调用Transformer的transform()方法将创建的XML转换成Result,Result可通过new File()构建输出文件
/** 
     * DOM方式创建xml文件 
     * @param file 文件 
     * @throws Exception 
     */ 
    public static void DOMcreate(File file)throws Exception{ 
        DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); 
        DocumentBuilder db=dbf.newDocumentBuilder(); 
        Document document=db.newDocument(); 
        document.setXmlStandalone(true); 
        Element root=document.createElement("tb_student"); 
        for (int i = 0; i < 3; i++) { 
            Element student=document.createElement("student"); 
            Element name=document.createElement("name"), 
                    age=document.createElement("age"), 
                    grade=document.createElement("grade"); 
                student.setAttribute("id", i+""); 
                name.setTextContent("张"+i); 
                age.setTextContent(""+i*5); 
                grade.setTextContent(""+i*20); 
                student.appendChild(name); 
                student.appendChild(age); 
                student.appendChild(grade); 
            root.appendChild(student); 
        } 
        document.appendChild(root);      
        TransformerFactory tff=TransformerFactory.newInstance(); 
        Transformer tf=tff.newTransformer(); 
        tf.setOutputProperty(OutputKeys.INDENT, "yes"); 
        tf.transform(new DOMSource(document), new StreamResult(file)); 
    }

SAX:

  1. 用ArrayList存储xml所需的对象集合
  2. 通过SAXTransformerFactory的静态方法newInstance()创建一个SAXTransformerFactory对象
  3. 通过SAXTransformerFactory对象的newTransformerHandler()创建一个TransformerHandler对象
  4. 通过TransformerHandler对象的getTransformer()创建一个Transformer对象
  5. Transformer对象的setOutputProperty(OutputKeys.INDENT,”yes”)可以实现换行(可选)
  6. Transformer对象的setOutputProperty(OutputKeys.ENCODING,”编码名称”)可以实现编码格式(可选)
  7. 创建Result对象,并使用TransformerHandler对象的setResult(Result)方法使其与TransformerHandler关联
  8. 使用TransformerHandler对象的进行xml文件内容的编写(遍历ArrayList创建各个节点)
    startDocument();//开始文档
    endDocument();//结束文档
    startElement(String uri,String localName,String qName,Attributes atts);//元素标签开始
    endElement(String uri,String localName,String qName,Attributes atts);//元素标签结束
    /** 
     * SAX方式创建xml文件 
     * @param file 
     * @throws Exception 
     */ 
    public static void SAXcreate(File file)throws Exception { 
        //初始化要生成文件的数据 
        ArrayList<Student> students=new ArrayList<Student>(); 
        for (int i = 0; i < 3; i++) { 
            Student student=new Student(i,"张"+i,5*i,10*i); 
            students.add(student); 
        } 
 
        SAXTransformerFactory stf=(SAXTransformerFactory) SAXTransformerFactory.newInstance(); 
        TransformerHandler handler=stf.newTransformerHandler(); 
        Transformer tf=handler.getTransformer(); 
        tf.setOutputProperty(OutputKeys.INDENT, "yes");//标签自动换行 
        tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");//编码格式 
        StreamResult result=new StreamResult(file);//创建Result对象 
        handler.setResult(result);//关联 
 
        handler.startDocument(); 
        handler.startElement("", "", "tb_students", null);//根节点标签 
 
        for (Student student : students) { 
            AttributesImpl atts=new AttributesImpl();//创建熟悉 
            atts.addAttribute("", "", "id", "", student.getId()+""); 
            handler.startElement("", "", "student", atts);//元素标签开始 
 
            handler.startElement("", "", "name", null);//元素标签开始 
            handler.characters(student.getName().toCharArray(), 0, student.getName().length());//元素标签内容 
            handler.endElement("", "", "name");//元素标签结束 
 
            handler.startElement("", "", "age", null); 
            handler.characters((""+student.getAge()).toCharArray(), 0, (""+student.getAge()).length()); 
            handler.endElement("", "", "age"); 
 
            handler.startElement("", "", "grade", null); 
            handler.characters((""+student.getGrade()).toCharArray(), 0,(""+student.getGrade()).toCharArray().length); 
            handler.endElement("", "", "grade"); 
 
            handler.endElement("", "", "student");//元素标签结束 
        } 
 
        handler.endElement("", "", "tb_students");//结束根节点标签 
        handler.endDocument(); 
    }

实体类student

package entity; 
 
public class Student {
    
 
    private int id; 
    private String name; 
    private int age; 
    private int grade; 
 
    public Student() { 
        // TODO Auto-generated constructor stub 
    } 
    public Student(int id, String name, int age, int grade) { 
        super(); 
        this.id = id; 
        this.name = name; 
        this.age = age; 
        this.grade = grade; 
    } 
    public int getId() { 
        return id; 
    } 
    public void setId(int id) { 
        this.id = id; 
    } 
    public String getName() { 
        return name; 
    } 
    public void setName(String name) { 
        this.name = name; 
    } 
    public int getAge() { 
        return age; 
    } 
    public void setAge(int age) { 
        this.age = age; 
    } 
    public int getGrade() { 
        return grade; 
    } 
    public void setGrade(int grade) { 
        this.grade = grade; 
    } 
 
} 

DOM4J:

  1. 通过DocumentHelper的静态方法createDocument创建一个Document对象
  2. 创建节点:Document对象的addElement方法 返回Element对象
  3. 节点添加属性:Element对象的addAttribute方法
    节点添加内容:Element对象的setTextadd方法
  4. 创建XMLWriter对象 (new) (可使用输出流、OutputFormat作为参数,分别给出输出地址和格式)
    XMLWriter对象的setEscapeText方法可以设置字符是否转义,默认true(转义)
  5. 调用XMLWriter对象的write方法,Document对象作为参数
  6. 关闭XMLWriter对象,以及相关资源的close操作
    /** 
     * DOM4J方式创建xml文件 
     * @param file 
     * @throws Exception 
     */ 
    public static void DOM4Jcreate(File file)throws Exception{ 
        org.dom4j.Document document=DocumentHelper.createDocument(); 
        org.dom4j.Element root=document.addElement("rss"); 
        root.addAttribute("version", "2.0"); 
        org.dom4j.Element channel=root.addElement("channel"); 
        org.dom4j.Element title=channel.addElement("title"); 
        title.setText("新闻国内"); 
        //... 
        XMLWriter writer=new XMLWriter(new FileOutputStream(file),OutputFormat.createPrettyPrint()); 
        writer.setEscapeText(false);//字符是否转义,默认true 
        writer.write(document); 
        writer.close(); 
    }

注:此处模拟的是一个”rss”文件的生成部分代码,RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用。

JDOM:

  1. 创建Document对象 (new)
  2. 创建Element对象 (new) 并向其中添加属性/内容/子节点
  3. 向Document对象中添加Element节点 addContent/setContent
    (或者创建Document对象时将Element对象作为参数等)
  4. 创建XMLOutputter对象 (new) 并调用output方法生成xml文档
    /** 
     * JDOM方式创建xml文件 
     * @param file 
     * @throws Exception 
     */ 
    public static void JDOMcreate(File file)throws Exception{ 
        org.jdom2.Document document=new org.jdom2.Document(); 
        org.jdom2.Element root=new org.jdom2.Element("rss"); 
        root.setAttribute("version", "2.0"); 
        root.addContent( 
                new org.jdom2.Element("channel").addContent( 
                        new org.jdom2.Element("title").setText("新闻国内"))); 
        document.setRootElement(root); 
        XMLOutputter outputter=new XMLOutputter(); 
        outputter.setFormat(Format.getPrettyFormat());//设置文本格式 
        outputter.output(document, new FileOutputStream(file)); 
    }

发布评论
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

0编程经验,8步让你1小时轻松使用的UR工业机器人
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。