SAXParser를 이용하는 경우 내부적으로 이벤트가 발생하는데 각 이벤트에 대해 정의된 DefaultHandler 인터페이스를 구현한 클래스에서 각 노드에 대해 접근하여 발췌하도록 구성한다.
* 수정 : 2010.04.27
- characters 메서드 변경
* 수정 : 2010.05.07
- XmlHandler 코드를 정리해서 추가 첨부
- empty element의 경우 데이터 획득이 안 되면서 element자체도 획득이 안 되는 문제 개선.
ReadXml.java
package com.xml;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
public class ReadXml {
public List read(String strUrl) {
XmlHandler dh = null;
try {
URL url = new URL(strUrl);
URLConnection urlConn = url.openConnection();
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
BufferedInputStream bis = new BufferedInputStream(urlConn.getInputStream());
dh = new XmlHandler();
parser.parse(bis, dh);
} catch(MalformedURLException e) {
System.out.println("[ MalformedURLException : " + strUrl + " ]");
e.printStackTrace();
} catch (ParserConfigurationException e) {
System.out.println("[ ParserConfigurationException ]");
e.printStackTrace();
} catch (SAXException e) {
System.out.println("[ SAXException ]");
e.printStackTrace();
} catch (IOException e) {
System.out.println("[ IOException ]");
e.printStackTrace();
}
return dh.getList();
}
}
XmlHandler.java
package com.xml;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class XmlHandler extends DefaultHandler {
String strJobName = "";
private List list = new ArrayList();
private HashMap map = null;
private String strEname = "";
private StringBuffer strBuff = new StringBuffer();
private boolean bIsColumn = false;
public void startDocument( ) throws SAXException {
System.out.println( "SAX Event: [" + strJobName + "] START DOCUMENT ##################################" );
}
public void endDocument( ) throws SAXException {
System.out.println( "List Size is " + list.size() );
System.out.println( "SAX Event: [" + strJobName + "] END DOCUMENT ####################################" );
}
@SuppressWarnings("unchecked")
public void startElement(String uri, String localName, String eName, Attributes attr) throws SAXException {
// System.out.println("SAX Event: START Element localName: " + localName);
// System.out.println("SAX Event: START Element eName: " + eName);
//발췌 대상 엘리먼트 구분(엘리먼트 prefix로 구분함)
if( eName.equals("item") ) {
map = new HashMap();
} else if( eName.substring(0, 3).equals("ns3") && !eName.equals("ns3:data") ) {
strEname = eName.substring(4);
bIsColumn = true;
//데이터 버퍼 초기화
strBuff.setLength(0);
// System.out.println(" Check Element eName: " + eName.substring(4));
} else {
bIsColumn = false;
}
}
@SuppressWarnings("unchecked")
public void endElement(String uri, String localName, String eName) throws SAXException {
if( eName.equals("item") ) {
list.add(map);
// System.out.println("SAX Event: END Element eName: " + eName);
} else {
if(bIsColumn) {
// System.out.println(strEname + " : ["+ strBuff.toString().trim() + "]");
map.put(strEname, strBuff.toString().trim());
}
}
}
public void characters(char[] ch, int start, int length) throws SAXException {
//발췌 대상 엘리먼트의 값만 추출
if(bIsColumn) {
strBuff.append(ch, start, length);
// System.out.println(strEname + " is [" + map.get(strEname) + "]");
// System.out.println("Char Start : " + start + " Length : " + length);
}
}
/**
* 발췌한 대상 서비스 데이터 리턴
* @return List
*/
@SuppressWarnings("unchecked")
public List getList() {
return this.list;
}
}
댓글 없음:
댓글 쓰기