Java SE/STAX(Streaming API for XML)

Streaming API for XML

Soul-Learner 2012. 7. 22. 16:01

Java SE STaX ( Streaming API for XML ) example

Java SE 6부터 제공되는 ATaX 를 이용하여 XML파일의 데이터를 읽고 쓰는 예제이다. STaX는 기존의 방법인 SAX, DOM 방식을 대체할 새로운 방법이다. XML파일을 읽을 때는 XMLEventReader를 이용하고 XML 파일에 기록할 때는 XMLEventWriter를 이용한다.

ATax는 2가지 방법으로 접근할 수 있다. Cursor나 Event Iterator를 이용하여 접근할 수 있으며 여기서는 더 편리한 Event Iterator 방식을 소개한다. 

STaX방법은 기존 API(SAX, DOM)와는 달리 개발자의 응용프로그램에서 파서를 충분히 제어할 수 있는 특징을 가지고 있다.

Android에서 XML을 다루기 위한 XmlPullParser와 같은 특징을 가지고 있다고 할 수 있겠다. 그리고 XML문서를 파일에 저장할 수 있는 API, XMLEventWriter도 제공되는데 개행문자(\n")와 탭문자(\t)는 자동으로 추가되지 않으므로 필요한 곳에 개발자가 직접 언급해 주어야 한다.

Android 에서도 이와 유사한 XmlPullParser가 제공된다. 여기를 참조하세요


D:/test/student.xml ( STaX를 사용하여 파싱할 XML 파일의 내용 )

<?xml version="1.0" encoding="EUC-KR"?> <course> <student id="11"> <name>김사랑</name> <phone>010-3456-7654</phone> <email>sarang@naver.com</email> <birth_date>1980-11-20</birth_date> </student> <student id="12"> <name>이수복</name> <phone>010-5687-6345</phone> <email>suboklee@yahoo.com</email> <birth_date>1980-11-20</birth_date> </student> <student id="13"> <name>박진수</name> <phone>010-7689-7544</phone> <email>jinsupark@gmail.com</email> <birth_date>1980-11-20</birth_date> </student> </course>


Student.java ( 읽어온 XML 문서의 내용을 저장할 클래스 )

package com.example.xml; public class Student { private int id; private String name; private String phone; private String email; private String birthDate; 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 String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getBirthDate() { return birthDate; } public void setBirthDate(String birth_date) { this.birthDate = birth_date; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", phone=" + phone + ", email=" + email + ", birth date=" + birthDate+"]"; } }


StaxReader.java ( STaX 를 이용하여 XML 문서의 내용을 읽어오면서 Student 객체에 저장한다 )

package com.example.xml; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.events.Attribute; import javax.xml.stream.events.EndElement; import javax.xml.stream.events.StartElement; import javax.xml.stream.events.XMLEvent; public class StaxReader { public List<Student> readStudent(String filePath) { List<Student> items = new ArrayList<Student>(); try { // First create a new XMLInputFactory XMLInputFactory inputFactory = XMLInputFactory.newInstance(); // Setup a new eventReader InputStream in = new FileInputStream(filePath); XMLEventReader eventReader = inputFactory.createXMLEventReader(in); // Read the XML document Student student = null; while (eventReader.hasNext()) { XMLEvent event = eventReader.nextEvent(); //if(event.isStartDocument()){xxxx}; if (event.isStartElement()) { StartElement startElement = event.asStartElement(); // If we have a item element we create a new item if (startElement.getName().getLocalPart().equals("student")) { student = new Student(); // We read the attributes from this tag and add the date // attribute to our object Iterator<Attribute> attributes = startElement .getAttributes(); while (attributes.hasNext()) { Attribute attribute = attributes.next(); if (attribute.getName().toString().equals("id")) { student.setId(Integer.valueOf(attribute.getValue())); } } } if (event.isStartElement()) { if (event.asStartElement().getName().getLocalPart() .equals("name")) { event = eventReader.nextEvent(); student.setName(event.asCharacters().getData()); continue; } } if (event.asStartElement().getName().getLocalPart() .equals("phone")) { event = eventReader.nextEvent(); student.setPhone(event.asCharacters().getData()); continue; } if (event.asStartElement().getName().getLocalPart() .equals("email")) { event = eventReader.nextEvent(); student.setEmail(event.asCharacters().getData()); continue; } if (event.asStartElement().getName().getLocalPart() .equals("birth_date")) { event = eventReader.nextEvent(); student.setBirthDate(event.asCharacters().getData()); continue; } } // If we reach the end of an item element we add it to the list if (event.isEndElement()) { EndElement endElement = event.asEndElement(); if (endElement.getName().getLocalPart().equals("student")) { items.add(student); } } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (XMLStreamException e) { e.printStackTrace(); } return items; } public static void main(String[] args) { StaxReader reader = new StaxReader(); List<Student> list = reader.readStudent("d:/test/student.xml"); for (Student item : list) { System.out.println(item); } } }



다음은 XMLEventWriter 를 이용한 XML문서의 파일저장 예이다

개행문자(\n), 탭문자(\t)는 자동으로 추가되지 않으므로 개발자가 직접 언급해주어야 한다.


D:/test/student2.xml ( XMLEventWriter를 이용하여 파일에 저장할 내용 )

<?xml version="1.0"?> <course> <student id="11"> <name>김순정</name> <phone>010-4576-8654</phone> <email>sunjung@yahoo.com</email> <birth_date>1980-01-02</birth_date> </student> </course>


StaxWriter.java

package com.example.xml; import java.io.FileOutputStream; import java.util.ArrayList; 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.Attribute; 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 StaxWriter { public void saveStudent() throws Exception { // Create a XMLOutputFactory XMLOutputFactory outputFactory = XMLOutputFactory.newInstance(); // Create XMLEventWriter XMLEventWriter eventWriter = outputFactory .createXMLEventWriter(new FileOutputStream("D:/test/student2.xml")); // Create a EventFactory XMLEventFactory eventFactory = XMLEventFactory.newInstance(); XMLEvent end = eventFactory.createDTD("\n"); XMLEvent tab = eventFactory.createDTD("\t");

// Create and write Start Tag StartDocument startDocument = eventFactory.createStartDocument(); eventWriter.add(startDocument); eventWriter.add(end); // Create course open tag StartElement rootStartElement = eventFactory.createStartElement("", "", "course"); eventWriter.add(rootStartElement); eventWriter.add(end); Attribute attr = eventFactory.createAttribute("id", "11"); ArrayList<Attribute> attrList = new ArrayList<Attribute>(); attrList.add(attr); StartElement stdStartElement = eventFactory.createStartElement("", "", "student", attrList.iterator(), null); eventWriter.add(tab); eventWriter.add(stdStartElement); eventWriter.add(end); // Write the different nodes createNode(eventWriter, "name", "김순정"); createNode(eventWriter, "phone", "010-4576-8654"); createNode(eventWriter, "email", "sunjung@yahoo.com"); createNode(eventWriter, "birth_date", "1980-01-02"); eventWriter.add(tab); eventWriter.add(eventFactory.createEndElement("", "", "student")); eventWriter.add(end); eventWriter.add(eventFactory.createEndElement("", "", "course")); eventWriter.add(end); eventWriter.add(eventFactory.createEndDocument()); eventWriter.close(); } private void createNode(XMLEventWriter eventWriter, String name, String value) throws XMLStreamException { XMLEventFactory eventFactory = XMLEventFactory.newInstance(); XMLEvent end = eventFactory.createDTD("\n"); XMLEvent tab = eventFactory.createDTD("\t"); // Create Start node StartElement sElement = eventFactory.createStartElement("", "", name); eventWriter.add(tab);eventWriter.add(tab); eventWriter.add(sElement); // Create Content Characters characters = eventFactory.createCharacters(value); eventWriter.add(characters); // Create End node EndElement eElement = eventFactory.createEndElement("", "", name); eventWriter.add(eElement); eventWriter.add(end); } public static void main(String[] args) throws Exception { StaxWriter writer = new StaxWriter(); writer.saveStudent();

System.out.println("XML파일 생성 성공"); } }