일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- LG유플러스
- Example
- swift3
- 포켓몬 GO
- 보라카이
- 공략
- 해몽
- GCD
- Xcode
- push
- error
- 신도림
- afterdelay
- 스마트폰
- 포켓볼
- Check
- 아이폰7
- UITableView
- 얻는법
- UIView
- IOS
- 신도림 테크노마트
- loop
- setting
- simulator
- 샘플
- Bitcode
- swift
- 앱스토어
- 페이백
- Today
- Total
도래울
[안드로이드] 개발 | 강좌 | 정보 | (XML 파서(Parser) & DOM & SAX & JSON & PullParser) 본문
[안드로이드] 개발 | 강좌 | 정보 | (XML 파서(Parser) & DOM & SAX & JSON & PullParser)
도래울 2016. 2. 5. 11:35XML
: 크게 DOM, SAX 두가지로 구분
1) DOM 파서
: 문서의 모든 내용을 메모리에 트리 형태로 펼친 후 읽기 때문에 속도는 대단히 빠르고,
임의의 노드를 여러번 읽을 수 있다. 하지만, 전체 문서를 다 읽어서 트리를 완성한 후에야
읽기가 가능하므로, 처음 시작이 다소 느리다는 단점이 있고, 문서가 커지면 메모리를
많이 소비하는 것도 문제다.
XML 편집도 가능하다.
================================ ex ===========================================
String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
"<order><item>Mouse</item></order>";
try{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
InputStream istream = new ByteArrayInputStream(xml.getBytes("utf-8"));
Document doc = builder.parse(istream);
Element order = doc.getDocumentElement();
NodeList items = order.getElementsByTagName("item");
Node item = items.item(0);
Node text = item.getFirstChild();
String ItemName = text.getNodeValue();
}
catch (Exception e){ ; }
===============================================================================
static DocumentBuilderFactory newInstance ()
DocumentBuilder newDocumentBuilder()
-> XML 문서를 열려면 먼저 DocumentBuilderFactory 객체 필요. (추상으로 newInstance로.)
이후에 추상클래스 newDocumentBuilder()도 필요.
Document parse (InputStream stream [, String systemId])
Document parse (String uri)
Document parse (File file)
-> XML 전체를 받아오는 것.
Element Document.getDocumentElement ()
-> XML 문서는 유일한 루트 엘리먼트를 가진다.
이 메서드가 루트 앨리먼트를 구한다. 루트를 구해야 자식들을 읽을 수 있다.
NodeList Element.getElementsByTagName (String tagname)
-> 루트 밑에 tagname을 가진 sub-parent를 구한다.
String getNodeName ()
short getNodeType ()
String getNodeValue ()
Node getFirstChild()
Node getLastChild()
Node getNextSibling ()
Node getPreviousSibling ()
Node getParentNode ()
NodeList getChildNodes ()
-> DOM은 엘리먼트 안의 문자열도 하나의 객체로 취급하기 때문에
태그 안의 문자열을 읽으려면 getFirstChild -> getNodeValue로 값을 읽어야 한다.
NamedNodeMap Node.getAttributes ()
-> 엘리먼트의 속성을 읽을 때, attribute 하나하나도 다 node로 매핑
================================ ex ===========================================
String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
"<order>" +
"<item Maker=\"Samsung\" Price=\"23000\">Mouse</item>"+
"<item Maker=\"LG\" Price=\"12000\">KeyBoard</item>" +
"<item Price\"156000\" Maker=\"Western Digital\">HDD</item"+"</order>";
try{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
InputStream istream = new ByteArrayInputStream(xml.getBytes("utf-8"));
Document doc = builder.parse(istream);
Element order = doc.getDocumentElement();
NodeList items = order.getElementsByTagName("item");
String result = "";
for (int i = 0; i < items.getLength; i++){
Node item = items.item(i);
Node text = item.getFirstChild();
String ItemName = text.getNodeValue();
Result += ItemName + " : ";
NamedNodeMap Attrs = item.getAttributes();
for (int j = 0; j < Attrs.getLength(); j++){
Node attr = Attrs.item(j);
Result += (attr.getNodeName() + " = " + attr.getNodeValues() + " ");
}
Reulst += "\n";
}
}
catch (Exception e){ ; }
===============================================================================
2) SAX 파서
: 문서를 순서대로 읽으면서 이벤트를 발생시키는 방식. 메모리를 거의 사용하지 않으며
기동 속도가 빠르다. 중간에 파싱을 멈출 수도 있으나, 읽기전용이다.
================================ ex ===========================================
String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
"<order><item>Mouse</item></order>";
try{
SAXParseFactory factory = SAXParseFacotry.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("result : " + handler.item);
}
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;
}
}
}
==================================================================================
-> DOM처럼 빌더 팩토리로부터 빌더 생성 -> 빌더로부터 파서 객체를 얻는다.
파서 객체로부터 리더 객체를 구하고, 리더에 내용 핸들러를 부착하면 문서를 읽으면서
정보를 발견할 때마다 핸들러로 이벤트를 보내준다.
문서가 시작되면 startDocument()
문서가 끝나면 endDocument()
Element가 시작하면 startElement()
Element가 끝나면 endElement()
문자열이 발견되면 characters()
3) 안드로이드 XmlPullParser
================================ ex ===========================================
String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
"<order><item>Mouse</item></order>";
boolean initem = false;
String ItemName = "";
try{
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
parser.setInput(new StringReader (xml));
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT){
switch(eventType){
case XmlPullParser.START_DOCUMENT:
case XmlPullParser.END_DOCUMENT:
case XmlPullParser.END_TAG:
break;
case XmlPullParser.START_TAG:
if (parser.getName().equals("item")){
initem = true;
}
break;
case XmlPullParser.TEXT:
if (initem){
ItemName = parser.getText();
initem = false;
}
break;
}
eventType = parser.next();
}
}
catch (Exception e) { ; }
=====================================================================================
4) JSON 파서 (Java Script Object Notation)
: 웹에서 정보를 주고받는 경량화된 방법.
XML 파서가 아닌 자체 포맷을 가지고 있다.
- 자체 포맷 -
1. 배열 : 대괄호 안에 값을 콤마로 나열 ex) [1, 2, 3]
2. 객체 : 중괄호 안에 이름:값 형태로 ex) {"name":"babo", "age":26}
3. 단순 값 : 수치, 문자열, 논리형, null 지원.
-JSONArray 클래스-
Object get (int index)
int getInt (int index)
String getString int index)
boolean getBoolean (int index)
JSONArray getJSONArray (int index)
JSONObject getJSONObject (int index)
-JSONObject 클래스-
Object get (String key)
int getInt (String key)
String getString (String key)
boolean getBoolean (String key)
JSONArray getJSONArray (String key)
JSONObject getJSONObject (String key)
Iterator keys ()
: next, hasnext 메서드를 반복적으로 호출하면 객체의 모든 멤버를 열거할 수 있다.
================================== ex ============================================
String Json = "[8, 9, 6, 2, 9]";
try{
int sum = 0;
JSONArray ja = new JSONArray(Json);
for (int i = 0; i < ja.length(); i++){
sum += ja.getInt(i);
}
}
catch (JSONException e){ ;}
===================================================================================
================================== ex ============================================
String Json = "[{\"Product\" : \"Mouse\", \"Maker\":\"Samsung\", \"Price\":23000},"
+ "{\"Product\" : \"KeyBoard\", \"Maker\":\"LG\", \"Price\":12000},"
+ "{\"Product\":\"HDD\", \"Maker\":\"Western Digital\", \"Price\"156000}]";
try{
String result = "";
JSONArray ja = new JSONArray(Json);
for (int i = 0; i < ja.length(); i++){
JSONObject order = ja.getJSONObject(i);
result += "product: " + order.getString("Product") + ", maker: " + order.getString("Maker") +
", price: " + order.getInt("Price") + "\n";
}
}
catch (JSONException e){ ;}
'개발 > Android' 카테고리의 다른 글
dialog(대화상자) 예제 (0) | 2016.02.05 |
---|---|
안드로이드(android) 탭(TabActivity) 3가지 구현하기 (1) | 2016.02.05 |
[JAVA] [Android] XML DOM Tree 구조 파악하기 (0) | 2016.02.05 |
SurfaceView, 간단한 예제로 이해하기^^ (0) | 2016.02.05 |
Android , EditText ,TextView 속성 정리 (0) | 2016.02.05 |