JAVA中的XML文件--文件写入

DOMSAX方式是JAVA官方提供的方式,可以生成一个XML文件来存储信息,DOM4JJDOM是非官方的方式,可以生成一个RSS文件。


1 应用DOM方式写入XML

1.1 准备工作

  • 和之前用DOM方式读取XML文件相同,需要创建一个DocumentBuilder对象:

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
  • 因为需要生成一个XML文件,所以不需要用parse()方法,直接用newDocument()方法获取一个Document对象 ,它就代表了我们要放在xml文件中的DOM树:

    Document document = db.newDocument();

1.2 创建元素、属性及元素中的文本

  • 用createElement(String ElementName)方法创建一个元素,并通过appendChild(Element e)方法给它添加子元素:

    //创建根元素
    Element school = document.createElement("school");
    //将根元素添加到document中去
    document.appendChild(school);
    //创建一个元素,并把它追加到根元素的子元素
    Element student = document.createElement("student");
    school.appendChild(student);
  • 给元素设置属性,使用setAttribute(name, value)方法:

    student.setAttribute("id", "0001");
  • 通过setTextContext(String)方法给元素添加文本:

    name.setTextContext("王明");

备注:
1. Document和Element对象中都有appendChild()方法,前者用来添加根元素,且只能使用一次,否则会产生错误(HIERARCHY_REQUEST_ERR: 尝试在不允许的位置插入节点),后者用来给调用它的元素添加子元素。

1.3 创建XML文件

  • 创建TransformerFactory对象通过newInstance(),然后创建Transformer对象通过TransformerFactory对象的newTransformer()方法(注意和DocumentBuilder(Factory)对比):

    TransformerFactory tff = TransformerFactory.newInstance();
    Transformer tf = tff.newTransformer();
  • Transformer对象中的方法transform(Source , stream)方法可以将我们创建好的Document对象转化为XML文件:

    tf.transform(new DOMSource(document),new streamResult(new File("students.xml");
  • 可以看到这样创建的xml文件所有的都在一行,可以使用tf的setOutProperty()方法来设置输出的属性:

    tf.setOutputProperty(OutputKeys.INDENT,"yes");

2 应用SAX方式写入XML

2.1 准备工作

  • 创建一个SAXTransformerFactory类的对象:

    SAXTransformerFactory stff = (SAXTransformerFactory)SAXTransformerFactory.newInstance();
  • 通过SAXTransformerFactory对象的newTransformerHandler()方法创建TransformerHandler的实例:

    TransformerHandler handler = stff.newTransformerHandler();
  • 通过handler对象创建一个transformer对象:

    Transformer transformer = handler.getTransformer();
  • 通过setOutputProperty()方法设置编码格式、是否换行等属性:

    transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
  • 创建一个Result对象,通过它去进行文件的创建和输出流的编写,并且使其与handler关联:

    Result result = new StreamResult(new fileOutputStream(new File("students2.xml")));
    handler.setResult(result);

    2.2 生成子元素及属性

    利用handler对象进行xml文件内容的编写:

  • 通过startDocument()方法打开document(),并添加元素通过startElement(String url,String localName,String qName,String attributes)方法(其中前两个(与命名空间有关)可以为空,后两个为元素名和元素属性集合):

    handler.startDocument();
    handler.startElement("","","school",attr);//attr参数在下一步介绍
  • 在上一步中需要传递Attributes,创建一个AttributesImpl对象,通过addAttribute(String url,String localName,String qName,String type,String value):

    AttributeImpl attr = new AttributeImpl();
    attr.addAttribute("","","id","","0001");
  • 给元素添加文本,通过character(
  • 按上述,会发现生成的XML文件里并没有内容,需要调用endDocument()结束,同时,在结束前必须调用endElement(String url,String localName,String qName)方法结束每个元素(给元素添加结束标志):

    handler.endElement("","","school");
    handler.endDocument();

    备注:

    1. 注意每个元素的startElement和endElement方法的嵌套和主子元素对应,否则XML文件中会出现错误
    2. 注意开始和结束调用startDocument和endDocument方法
    3. transformer设置属性必须在handler.setResult(result)前面写,否则设置的属性不会生效

3 应用DOM4J方式写入XML

3.1 RSS简介

简易信息聚合(聚合内容)是一种RSS基于XML标准,在互联网上被广泛采用的内容包装和投递协议。RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用

3.2 生成RSS元素及属性

  • 通过DocumetHelper下的createDocument()方法获取一个Document实例(代表整个XML文件):

    Document document = DocumentHelper.createDocument();
  • 通过Document中的addElement(String)方法创建根元素,通过addAttribute(String,String)方法给根元素添加属性:

    Element rss = document.addElement("rss");
    rss.addAttribute("version","2.0");
  • 在某个元素中创建子元素通过Element中的addElement(String)方法,并通过setText(String)方法向元素中添加文本内容:

    Element channel = rss.addElement("channel");
    channel.setText("CSDN");

3.3 生成XML文件

  • 通过XMLWriter的write()方法创建,利用XMLWriter的Output参数的构造方法来创建XMLWriter实例:

    File file = new File("rssnews.xml");
    XMLWriter writer = new XMLWriter(new FileOutputStream(file));
  • 设置XML文件格式,通过OutputFormat的createPrettyPrint()方法设置一个比较“漂亮”的格式(缩进和换行),通过setEncoding(String encoding)方法设置编码格式:

    OutputForm format = OutputFormat.createPrettyPrint();
    format.setEncoding("GBK");

    这样将format传给XMLWriter的构造方法,修改上一步的代码,使用另一个构造方法:

    XMLWriter writer = new XMLWriter(new FileOutputStream(file),format);
  • 处理转义字符(如尖括号“<”):

    writer.setEscapeText(false);

    该方法的默认参数值为 true,代表转义,所以 false 代表不转义。

  • 将document写入创建好的xml文件:

    writer.write(document);

备注:
1. 注意抛出的异常;
2. 以上所使用的类来自org.dom4j包下。


4 应用JDOM方式解析XML

  • 生成根元素,并为其添加属性:

    Element rss = new Element("rss");
    rss.setAttribute("version","2.0");
  • 通过传入根元素的构造方法生成一个document对象:

    Document document = new Document(rss);
  • 给元素添加子元素,并给子元素添加文本内容

    Element channel = new Element("channel");
    rss.addContent(channel);
    channel.setText("CSDN");
  • 创建一个XMLOutputer对象,将document转换成XML文档:

    XMLOutputter outputter = new XMLOutputter();
    outputter.output(document , new FileOutputStream(new File("rssnews.xml")));

    需要在XML中进行格式设置,可以给XMLOutputter()传递Format对象进行设置换行缩进、编码格式等:

    Format format = Format.getCompactFormat();
    format.setIndent("");

你可能感兴趣的:(JAVA基础)