package exam.andexam;
import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import android.app.*;
import android.os.*;
import android.view.*;
import android.widget.*;
public class C21_SaxParser extends Activity {
TextView mResult;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.c21_domparser);
mResult = (TextView)findViewById(R.id.result);
}
public void mOnClick(View v) {
String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
"<order><item>Mouse</item></order>";
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
XMLReader reader = parser.getXMLReader();
SaxHandler handler = new SaxHandler();
reader.setContentHandler(handler);
InputStream istream = new ByteArrayInputStream(xml.getBytes("utf-8"));
reader.parse(new InputSource(istream));
mResult.setText("주문 항목 : " + handler.item);
}
catch (Exception e) {
Toast.makeText(v.getContext(), e.getMessage(), 0).show();
}
}
class SaxHandler extends DefaultHandler {
boolean initem = false;
StringBuilder item = new StringBuilder();
public void startDocument () {}
public void endDocument() {}
public void startElement(String uri, String localName, String qName, Attributes atts) {
if (localName.equals("item")) {
initem = true;
}
}
public void endElement(String uri, String localName, String qName) {}
public void characters(char[] chars, int start, int length) {
if (initem) {
item.append(chars, start, length);
initem = false;
}
}
};
}
SAX 파서 예제로 공부중인데요
아래의 SaxHandler 클래스가 좀 이해가 안되서요
public void startDocument () {}
public void endDocument() {}
public void endElement(String uri, String localName, String qName) {}
위 3개의 메소드에 대한 내용은 아무것도 없는데
왜 썼는지 이해가 안되요;
3개의 메소드를 모두 주석처리하고 실행해도 주문항목 값은 제대로 가져오는데요..
왜 썼는지 이해가 안되요
DefaultHandler 확장형으로 클래스를 생성하면 만들어지는 메소드들인가요??
그리고 startElement, characters 메소드는 안드로이드가 필요할 때마다 호출하는것인지 알고싶어요....
그리고 SaxHandler 클래스를 꼭 생성하지 않고 바로 노드값 가져와도 될텐데
여기서는 왜 굳이 핸들러를 썼을까요? 책에는 별다른 설명이 없어서 ㅠㅠ 답변 부탁드립니다.
뚱땡이토끼님 답변 감사해요
[SaxHandler 클래스를 꼭 생성하지 않고 바로 노드값 가져와도 될텐데] 이 부분은..
SAX 예제 이전에 DOM 예제를 보았는데요. DOM에서는 핸들러를 따로 작성하지 않고 mOnClick()에서 바로 getDocumentElement? 메소드 등을 이용해서 바로 노드값을 가져왔는데~ SAX 예제는 핸들러를 따로 작성했길래 여쭤본거에요^^;;
내용이 없는 메소드는 지우고 실행했더니 원하는 결과를 잘 가져오던데..
예제에는 써져있길래 혹시 무슨 필요가 있나 싶어서 글을 올렸네요.
파서가 종류가 많아서 어떤 경우엔 뭘써야하는지 아직은 잘 모르겠어요; 좀 더 많은 경험과 개발을 해봐야 더 자세히 알 수 있을 것 같아요. JSON을 많이 쓴다고 하던데.. 어렵네요^^;;
답변 넘 감사합니다~^^




[SaxHandler 클래스를 꼭 생성하지 않고 바로 노드값 가져와도 될텐데]이부분은 무슨 말씀이신지 잘 모르겠습니다만, 위에 예제에 나오는 방식은 핸들러를 써서 문서의 시작과 끝, 그리고 Element의 시작과 끝의 이벤트?를 받아서 처리를 하는 방식입니다. 위에 item이라는 것이 있는지 여부만 확인한다면 굳이 문서의 끝이나 element의 끝날때 처리해야 되는 내용이 없기 때문에 메소드가 비어 있다고 봅니다. 그러나 예를 들어서 좀더 복잡하거나 item이라는 것이 여기저기 있을 시에는 시작과 끝을 확실히 구분해서 습득할 필요하 있겠죠... 찾아보시면 더 복잡한 예제도 있을 겁니다. 굳이 내용이 없는 메소드를 써야 하는지는 지워보시고 컴파일 해보셔서 문제없다면 안쓰셔도... 제가 컴파일 환경이 안됩니다... ㅜㅜ
XML파서는 종류가 여러가지니 쓰기 편하신걸 찾아서 쓰셔도 좋을듯...