Java SE/StaX, Read XML

StaX XML Read Example

Soul-Learner 2014. 8. 6. 17:11

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>