如何使用Java StAX Iterator API用Java编写XML文件
时间:2020-02-23 14:36:16 来源:igfitidea点击:
Java 6中引入了用于XML的Java Streaming API或者Java StAX API,它被认为优于DOM和SAX解析器。
如先前有关Java StAX API的文章所述,它由基于游标的API和基于迭代器的API组成。
其中我们将看到如何使用基于StAX Iterator的API(XMLEventWriter)在Java中编写XML文件。
package com.theitroad.xml; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.util.HashMap; import java.util.Map; import java.util.Set; import javax.xml.stream.XMLEventFactory; import javax.xml.stream.XMLEventWriter; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.events.Characters; import javax.xml.stream.events.EndElement; import javax.xml.stream.events.StartDocument; import javax.xml.stream.events.StartElement; import javax.xml.stream.events.XMLEvent; public class StaxXMLWriter { public static void main(String[] args) { String fileName = "/Users/hyman/employee.xml"; String rootElement = "Employee"; StaxXMLWriter xmlWriter = new StaxXMLWriter(); Map<String,String> elementsMap = new HashMap<String, String>(); elementsMap.put("name", "hyman"); elementsMap.put("age", "29"); elementsMap.put("role", "Java Developer"); elementsMap.put("gender", "Male"); xmlWriter.writeXML(fileName, rootElement, elementsMap); } public void writeXML(String fileName, String rootElement, Map<String, String> elementsMap){ XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newInstance(); try { XMLEventWriter xmlEventWriter = xmlOutputFactory .createXMLEventWriter(new FileOutputStream(fileName), "UTF-8"); //For Debugging - below code to print XML to Console //XMLEventWriter xmlEventWriter = xmlOutputFactory.createXMLEventWriter(System.out); XMLEventFactory eventFactory = XMLEventFactory.newInstance(); XMLEvent end = eventFactory.createDTD("\n"); StartDocument startDocument = eventFactory.createStartDocument(); xmlEventWriter.add(startDocument); xmlEventWriter.add(end); StartElement configStartElement = eventFactory.createStartElement("", "", rootElement); xmlEventWriter.add(configStartElement); xmlEventWriter.add(end); //Write the element nodes Set<String> elementNodes = elementsMap.keySet(); for(String key : elementNodes){ createNode(xmlEventWriter, key, elementsMap.get(key)); } xmlEventWriter.add(eventFactory.createEndElement("", "", rootElement)); xmlEventWriter.add(end); xmlEventWriter.add(eventFactory.createEndDocument()); xmlEventWriter.close(); } catch (FileNotFoundException | XMLStreamException e) { e.printStackTrace(); } } private static void createNode(XMLEventWriter eventWriter, String element, String value) throws XMLStreamException { XMLEventFactory xmlEventFactory = XMLEventFactory.newInstance(); XMLEvent end = xmlEventFactory.createDTD("\n"); XMLEvent tab = xmlEventFactory.createDTD("\t"); //Create Start node StartElement sElement = xmlEventFactory.createStartElement("", "", element); eventWriter.add(tab); eventWriter.add(sElement); //Create Content Characters characters = xmlEventFactory.createCharacters(value); eventWriter.add(characters); //Create End node EndElement eElement = xmlEventFactory.createEndElement("", "", element); eventWriter.add(eElement); eventWriter.add(end); } }
上面的程序创建下面的XML文件:
employee.xml
<?xml version="1.0" encoding="UTF-8"?> <Employee> <age>29</age> <name>hyman</name> <gender>Male</gender> <role>Java Developer</role> </Employee>
我已经使用\ n和\ t元素来创建格式化的XML,但是为了节省内存并减少处理时间,可以将其从实现中删除。
同样出于调试目的,您可以将输出流更改为System.out以将XML文件打印到控制台。