StaX XML Read Example
Streaming API for XML(StaX), XML Read Example
StaX 는 하나의 이벤트를 호출할 때마다 시작 태그, 태그 내의 값, 끝 태그로 이동하면서 쉽게 XML 노드의 값을 얻어 낼 수 있는 장점이 있다.
StaX 를 이용하여 태그의 속성 값을 구할 때는 이벤트를 호출할 필요가 없고 그 외(태그명, 태그 값)의 노드를 구할 때는 XMLEventReader.nextEvent()를 호출하여 다음 노드로 이동할 수 있다.
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;
/** Streaming API for XML
XML 태그의 속성을 구할 때를 제외하고는 이벤트를 이용하여
태그(시작태그, 끝태그)나 태그 바디(값)으로 이동하면서 태그명과 태그 값을 구해온다
*/
public class StaXParser {
static final String MEMBER = "member";
static final String BIRTH = "birth";
static final String NAME = "name";
static final String ID = "id";
static final String PHONE = "phone";
static final String EMAIL = "email";
public static void main(String args[]) {
StaXParser read = new StaXParser();
List<Member> list = read.readMembers("D:/test/members.xml");
for (Member m : list) {
System.out.printf("%s, %s\n", m.getName(), m.getPhone());
}
}
@SuppressWarnings({ "unchecked", "null" })
public List<Member> readMembers(String configFile) {
List<Member> memList = new ArrayList<Member>();
try {
// First, create a new XMLInputFactory
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
// Setup a new eventReader
InputStream in = new FileInputStream(configFile);
XMLEventReader eventReader = inputFactory.createXMLEventReader(in);
// read the XML document
Member m = null;
while (eventReader.hasNext()) {
XMLEvent event = eventReader.nextEvent();
if (event.isStartElement()) {
StartElement startElement = event.asStartElement();
// If we have an item element, we create a new item
if (startElement.getName().getLocalPart() == (MEMBER)) {
m = new Member();
// 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(BIRTH)) {
m.setBirth(attribute.getValue());
}
}
continue;
}
if (event.asStartElement().getName().getLocalPart().equals(NAME)) {
event = eventReader.nextEvent();
m.setName(event.asCharacters().getData());
continue;
}
if (event.asStartElement().getName().getLocalPart().equals(ID)) {
event = eventReader.nextEvent();
m.setId(event.asCharacters().getData());
continue;
}
if (event.asStartElement().getName().getLocalPart().equals(PHONE)) {
event = eventReader.nextEvent();
m.setPhone(event.asCharacters().getData());
continue;
}
if (event.asStartElement().getName().getLocalPart().equals(EMAIL)) {
event = eventReader.nextEvent();
m.setEmail(event.asCharacters().getData());
continue;
}
}// end of outer if()
// 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() == (MEMBER)) {
memList.add(m);
}
}
}// end of while()
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (XMLStreamException e) {
e.printStackTrace();
}
return memList;
}
}
Member.java
package org.kdea.java.xml;
public class Member
{
private String name;
private String birth;
private String id;
private String email;
private String phone;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getBirth() {
return birth;
}
public void setBirth(String birth) {
this.birth = birth;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
members.xml
<?xml version="1.0" encoding="euc-kr"?>
<members>
<member birth="2010-12-02">
<name>홍길동</name>
<id>11</id>
<phone>010-2136-8459</phone>
<email>hong@naver.com</email>
</member>
<member birth="2007-03-15">
<name>김인철</name>
<id>12</id>
<phone>010-6518-2597</phone>
<email>kim@dls.com</email>
</member>
<member birth="2012-082-21">
<name>최재철</name>
<id>13</id>
<phone>010-1497-3279</phone>
<email>choi@daum.net</email>
</member>
</members>