1
ANDROID NÂNG CAOANDROID NÂNG CAO
Bài 8:
JSON & XML ParsingJSON & XML Parsing
2
Nội dung bài học
● JSON Parsing.
● XML Parsing.
3
Nội dung bài học
● JSON Parsing.
● XML Parsing.
4
JSON Parsing
● Hiện nay rất nhiều Web service cung cấp dữ liệu
dưới định dạng JSON. Do đó chúng ta cần
chuyển chuỗi kí tự dưới định dạng JSON thành
các đối tượng Java để có thể sử dụng trong
chương trình. Quá trình này gọi là JSON
parsing.
● Android cung cấp package org.json trong đó có
2 class chính JSONObject và JSONArray giúp
chúng ta thực hiện JSON parsing dễ dàng.
5
JSON Parsing
● JSONObject:
● JSONObject là class đại điện cho một đối tượng
trong chuỗi JSON.
● Một đối tượng trong chuỗi JSON được bọc trong cặp
dấu ngoặc nhọn “{“,”}”.
● Để tạo ra đối tượng JSONObject chúng ta sử dụng
phương thức khởi tạo và truyền chuỗi JSON biểu
diễn đối tượng đó vào tham số thứ nhất.
● JSONObject cung cấp các phương thức getter để
chúng ta truy xuất đến các thuộc tính của nó:
JSONObject#getXXX(String key)
6
JSON Parsing
● JSONObject:
● Danh sách các phương thức getter thường sử dụng:
– getDouble
– getInt
– getLong
– getString
– get
– getBoolean
– getJSONArray
– getJSONObjects
7
JSON Parsing
● JSONArray:
● Là class đại diện cho array trong chuỗi JSON.
● Array trong chuỗi JSON là một đối tượng được bọc
trong cặp ngoặc vuông “[“, “]”.
● Để tạo ra đối tượng JSONArray chúng ta sử dụng
phương thức khởi tạo và truyền chuỗi JSON biểu
diễn nó vào tham số thứ nhất.
● JSONArray cũng cung cấp các phương thức getter
giống như JSONObject để truy xuất giá trị các thuộc
tính.
8
JSON Parsing
● Ví dụ:
● Chúng ta cần viết chương trình để parse đoạn JSON
sau đây:
[
{
“name”:”Nguyen Van A”,
“old”:”17”
},
{
“name”:”Nguyen Van B”,
“old”:”80”
}
]
9
JSON Parsing
● Các bước để parse như sau:
1.Tạo JSONArray từ chuỗi JSON đã cho.
2. Sử dụng vòng lặp for để xử lý cho các JSONObject
bên trong.
3. Lấy JSONObject từ JSONArray qua các bước lặp.
4.Sử dụng phương thức getter phù hợp để lấy giá trị.
10
JSON Parsing
● Đoạn chương trình mẫu như sau:
import org.json.JSONArray;
import org.json.JSONObject;
・・・
try {
   JSONArray objects = new JSONArray(jsonstring);
for (int i = 0; i < objects.length(); i++) {
JSONObject person = objects.getJSONObject(i);
Log.d(“JSON”,“name:" + person.getString(“name") );
Log.d(“JSON”,“old:" + person.getString(“old") );
Log.d(“JSON”,"======================");
}
} catch (Exception e) {
}
・・・
11
JSON Parsing
● Xem thêm:
● Jackson JSON library: http://jackson.codehaus.org
12
Nội dung bài học
● JSON Parsing.
● XML Parsing.
13
XML Parsing
● Giới thiệu các phương pháp parse XML.
● DOM
● SAX
● XmlPull
14
XML Parsing
● Giới thiệu các phương pháp parse XML.
● DOM
● SAX
● XmlPull
15
XML Parsing
● Giới thiệu các phương pháp parse XML
● DOM (Document Object Model)
– Sử dụng cấu trúc cây, lưu trữ trên bộ nhớ heap.
– Tất cả nội dung của tập tin cần parse được chứa trong bộ
nhớ và sau khi parse xong chúng ta có thể truy xuất đến
bất kỳ một phần tử vào bất cứ lúc nào.
– Do phải lưu nội dung của tập tin XML trên bộ nhớ nên đòi
hỏi bộ nhớ phải lớn đây là một hạn chế trên các thiết bị di
động.
– Do đó phương pháp này chỉ phù hợp cho các trường hợp
tập tin XML cần parse có dung lượng nhỏ.
16
XML Parsing
● Giới thiệu các phương pháp parse XML
● SAX (Simple API for XML)
– SAX dựa trên các sự kiện khi parse.
– Chương trình parse (parser) đọc tập tin XML cần parse từ
đầu tập tin và cứ mỗi lần một sự kiện như mở, đóng một
tag thì callback function trong chương trình được gọi để
thực thi.
– Phía chương trình không điều khiển được việc đọc tập tin
XML như DOM.
– Phương pháp này ít tốn vùng nhớ hơn DOM.
– Trong Android có hai cách sử dụng SAX: cách thông
thường hay cách sử dụng wrapper.
17
XML Parsing
● Giới thiệu các phương pháp parse XML
● XMLPullParser (XPP)
– XPP dựa trên mô hình pull(khi nào cần mới parse, có thể
điều khiển quá trình parse). XPP giống như StAX như
trong Java. Android không hỗ trợ StAX mà hỗ trợ XPP.
– Chương trình parse (parser) đọc tập tin XML cần parse từ
đầu tập tin và quá trình parse có thể điều khiển từ chương
trình.Thông tin có thể lấy từ parser nếu cần..
– Do quá trình parse có thể điều khiển từ phía chương trình
cho nên việc parse có thể dừng lại sớm, tiết kiệm thời
gian.
18
XML Parsing
● Giới thiệu các phương pháp parse XML
DOM SAX XMLPullParser
Cấu trúc parser Cấu trúc cây Dựa vào kiểu sự
kiện (không điều
khiển được)
Dựa vào kiểu sự kiện
(điều khiển được)
Truy xuất phần tử Truy xuất bất kì Truy xuất tuần tự Truy xuất tuần tự
Lấy thông tin phần tử Truy xuất cây DOM Qua hàm callback Truy xuất qua vòng lặp
Ghi vào tập tin Có thể Không thể Có thể
Chi phí bộ nhớ Nhiều Ít nhất Ít
Dễ sử dụng Dễ Khó Dễ
19
XML Parsing
● XML file dùng để demo (sample.xml) có nội
dung:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<node>Node Value</node>
</root>
20
XML Parsing
● Giới thiệu các phương pháp parse XML
● DOM
● SAX
● XmlPullParser
21
XML Parsing
● DOM:
● Để parse XML sử dụng DOM, tiến hành các bước
sau:
– Get đối tượng Document từ XML data:
● Tạo đối tượng DocumentBuilderFactory
● Tạo đối tượng DOMParser
● Phân tích XML và xây dựng DOM tree.
– Truy xuất phần tử gốc của cây.
– Truy xuất phần tử bất kỳ trong cây.
– Truy xuất dữ liệu đang lưu trữ trong nút của cây.
22
XML Parsing
● DOM:
InputStream in = null;
try {
DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbfactory.newDocumentBuilder();
in = getAssets().open("sample.xml");
Document doc = builder.parse(in);
//Truy xuat phan tu goc <root>
Element root = doc.getDocumentElement();
// Get <node>
NodeList entryList = root.getElementsByTagName("node");
//Lay nut dau tien trong danh sach cac nut <node>
Element nodeElement = (Element) entryList.item(0);
// Gia tri luu tru o <node>
String nodevalue = nodeElement.getFirstChild().getNodeValue();
Log.v(“DOM”, nodevalue);
} catch (Exception e) {
//Xử lý exception
}
23
XML Parsing
● Giới thiệu các phương pháp parse XML
● DOM
● SAX
● XmlPullParser
24
XML Parsing
● SAX
● Các bước thực hiện:
1.Tạo event handler class, lớp này nhận callback từ
SAXParser.
2. Tạo đối tượng SAXParserFactory và tạo đối tượng
SAXParser.
3.Set event handler tạo ở bước 1 cho SAXParser.
4.Tiến hành parse xml bằng cách gọi phương thức
SAXParser#parse
5.Mỗi khi một sự kiện xảy ra nó sẽ gọi callback tương ứng
trong event handler được tạo ra ở bước 1.
25
XML Parsing
● SAX
● Các bước thực hiện:
1.Tạo event handler class, lớp này nhận callback từ
SAXParser:
 Tạo class thừa kế từ class DefaultHandler.
 Hiện thực các callback tương ứng với từng sự kiện:
 Start tag → startElement
 End tag → endElement
 Text trong 1 tag → character
26
XML Parsing
● SAX class SaxHandler extends DefaultHandler {
//Tag starting flag
boolean isNode;
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if ("node".equals(localName)) {
// Start node tag
isNode= true;
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if ("node".equals(localName)) {
// End node tag
isNode= false;
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
//If node tag is started, output text string to log
if (isNode) {
String nodevalue = new String(ch, start, length);
Log.v(“SAX”, nodevalue);
}
}
}
27
XML Parsing
● SAX
// Create factory of parse
SAXParserFactory saxParaser = SAXParserFactory.newInstance();
Try {
InputStream in = getAssets().open("sample.xml");
/* Get parser */
SAXParser sp = saxParaser.newSAXParser();
/* Create event handler */
SaxHandler sh = new SaxHandler();
/* Pass the input data and event handler to event handler */
sp.parse(in, sh);
} catch (Exception e) {
Log.e(“SAX”,”Error:”,e);
}
28
XML Parsing
● Giới thiệu các phương pháp parse XML.
● DOM
● SAX
● XmlPullParser
29
XML Parsing
● XmlPullParser:
● Các bước để parse xml bằng XmlPullParser:
– Tạo đối tượng XmlPullParser.
– Truyền nội dung của tập tin XML cần parse cho parser.
– Lấy được các sự kiện và phân tích.
30
XML Parsing
● XmlPullParser:
InputStream in = null;
try {
// Get stream of analyzing target
in = getAssets().open("sample.xml");
final XmlPullParser parser = Xml.newPullParser();
parser.setInput(new InputStreamReader(in));
parser.next(); // root tag
parser.next(); // node tag
String tag = parser.getName();
if ("node".equals(tag)) {
parser.next();
String nodevalue = parser.getText();
Log.v(“XMLParser”, nodevalue);
}
} catch (Exception e) {
//Xu ly exception
}
Nguyen Huu Phuoc, MEng.
●  Blog:http://folami.nghelong.com
●  Website http://phuocnh.nghelong.com

Android Nâng cao-Bài 8-JSON & XML Parsing

  • 1.
    1 ANDROID NÂNG CAOANDROIDNÂNG CAO Bài 8: JSON & XML ParsingJSON & XML Parsing
  • 2.
    2 Nội dung bàihọc ● JSON Parsing. ● XML Parsing.
  • 3.
    3 Nội dung bàihọc ● JSON Parsing. ● XML Parsing.
  • 4.
    4 JSON Parsing ● Hiệnnay rất nhiều Web service cung cấp dữ liệu dưới định dạng JSON. Do đó chúng ta cần chuyển chuỗi kí tự dưới định dạng JSON thành các đối tượng Java để có thể sử dụng trong chương trình. Quá trình này gọi là JSON parsing. ● Android cung cấp package org.json trong đó có 2 class chính JSONObject và JSONArray giúp chúng ta thực hiện JSON parsing dễ dàng.
  • 5.
    5 JSON Parsing ● JSONObject: ●JSONObject là class đại điện cho một đối tượng trong chuỗi JSON. ● Một đối tượng trong chuỗi JSON được bọc trong cặp dấu ngoặc nhọn “{“,”}”. ● Để tạo ra đối tượng JSONObject chúng ta sử dụng phương thức khởi tạo và truyền chuỗi JSON biểu diễn đối tượng đó vào tham số thứ nhất. ● JSONObject cung cấp các phương thức getter để chúng ta truy xuất đến các thuộc tính của nó: JSONObject#getXXX(String key)
  • 6.
    6 JSON Parsing ● JSONObject: ●Danh sách các phương thức getter thường sử dụng: – getDouble – getInt – getLong – getString – get – getBoolean – getJSONArray – getJSONObjects
  • 7.
    7 JSON Parsing ● JSONArray: ●Là class đại diện cho array trong chuỗi JSON. ● Array trong chuỗi JSON là một đối tượng được bọc trong cặp ngoặc vuông “[“, “]”. ● Để tạo ra đối tượng JSONArray chúng ta sử dụng phương thức khởi tạo và truyền chuỗi JSON biểu diễn nó vào tham số thứ nhất. ● JSONArray cũng cung cấp các phương thức getter giống như JSONObject để truy xuất giá trị các thuộc tính.
  • 8.
    8 JSON Parsing ● Vídụ: ● Chúng ta cần viết chương trình để parse đoạn JSON sau đây: [ { “name”:”Nguyen Van A”, “old”:”17” }, { “name”:”Nguyen Van B”, “old”:”80” } ]
  • 9.
    9 JSON Parsing ● Cácbước để parse như sau: 1.Tạo JSONArray từ chuỗi JSON đã cho. 2. Sử dụng vòng lặp for để xử lý cho các JSONObject bên trong. 3. Lấy JSONObject từ JSONArray qua các bước lặp. 4.Sử dụng phương thức getter phù hợp để lấy giá trị.
  • 10.
    10 JSON Parsing ● Đoạnchương trình mẫu như sau: import org.json.JSONArray; import org.json.JSONObject; ・・・ try {    JSONArray objects = new JSONArray(jsonstring); for (int i = 0; i < objects.length(); i++) { JSONObject person = objects.getJSONObject(i); Log.d(“JSON”,“name:" + person.getString(“name") ); Log.d(“JSON”,“old:" + person.getString(“old") ); Log.d(“JSON”,"======================"); } } catch (Exception e) { } ・・・
  • 11.
    11 JSON Parsing ● Xemthêm: ● Jackson JSON library: http://jackson.codehaus.org
  • 12.
    12 Nội dung bàihọc ● JSON Parsing. ● XML Parsing.
  • 13.
    13 XML Parsing ● Giớithiệu các phương pháp parse XML. ● DOM ● SAX ● XmlPull
  • 14.
    14 XML Parsing ● Giớithiệu các phương pháp parse XML. ● DOM ● SAX ● XmlPull
  • 15.
    15 XML Parsing ● Giớithiệu các phương pháp parse XML ● DOM (Document Object Model) – Sử dụng cấu trúc cây, lưu trữ trên bộ nhớ heap. – Tất cả nội dung của tập tin cần parse được chứa trong bộ nhớ và sau khi parse xong chúng ta có thể truy xuất đến bất kỳ một phần tử vào bất cứ lúc nào. – Do phải lưu nội dung của tập tin XML trên bộ nhớ nên đòi hỏi bộ nhớ phải lớn đây là một hạn chế trên các thiết bị di động. – Do đó phương pháp này chỉ phù hợp cho các trường hợp tập tin XML cần parse có dung lượng nhỏ.
  • 16.
    16 XML Parsing ● Giớithiệu các phương pháp parse XML ● SAX (Simple API for XML) – SAX dựa trên các sự kiện khi parse. – Chương trình parse (parser) đọc tập tin XML cần parse từ đầu tập tin và cứ mỗi lần một sự kiện như mở, đóng một tag thì callback function trong chương trình được gọi để thực thi. – Phía chương trình không điều khiển được việc đọc tập tin XML như DOM. – Phương pháp này ít tốn vùng nhớ hơn DOM. – Trong Android có hai cách sử dụng SAX: cách thông thường hay cách sử dụng wrapper.
  • 17.
    17 XML Parsing ● Giớithiệu các phương pháp parse XML ● XMLPullParser (XPP) – XPP dựa trên mô hình pull(khi nào cần mới parse, có thể điều khiển quá trình parse). XPP giống như StAX như trong Java. Android không hỗ trợ StAX mà hỗ trợ XPP. – Chương trình parse (parser) đọc tập tin XML cần parse từ đầu tập tin và quá trình parse có thể điều khiển từ chương trình.Thông tin có thể lấy từ parser nếu cần.. – Do quá trình parse có thể điều khiển từ phía chương trình cho nên việc parse có thể dừng lại sớm, tiết kiệm thời gian.
  • 18.
    18 XML Parsing ● Giớithiệu các phương pháp parse XML DOM SAX XMLPullParser Cấu trúc parser Cấu trúc cây Dựa vào kiểu sự kiện (không điều khiển được) Dựa vào kiểu sự kiện (điều khiển được) Truy xuất phần tử Truy xuất bất kì Truy xuất tuần tự Truy xuất tuần tự Lấy thông tin phần tử Truy xuất cây DOM Qua hàm callback Truy xuất qua vòng lặp Ghi vào tập tin Có thể Không thể Có thể Chi phí bộ nhớ Nhiều Ít nhất Ít Dễ sử dụng Dễ Khó Dễ
  • 19.
    19 XML Parsing ● XMLfile dùng để demo (sample.xml) có nội dung: <?xml version="1.0" encoding="UTF-8"?> <root> <node>Node Value</node> </root>
  • 20.
    20 XML Parsing ● Giớithiệu các phương pháp parse XML ● DOM ● SAX ● XmlPullParser
  • 21.
    21 XML Parsing ● DOM: ●Để parse XML sử dụng DOM, tiến hành các bước sau: – Get đối tượng Document từ XML data: ● Tạo đối tượng DocumentBuilderFactory ● Tạo đối tượng DOMParser ● Phân tích XML và xây dựng DOM tree. – Truy xuất phần tử gốc của cây. – Truy xuất phần tử bất kỳ trong cây. – Truy xuất dữ liệu đang lưu trữ trong nút của cây.
  • 22.
    22 XML Parsing ● DOM: InputStreamin = null; try { DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbfactory.newDocumentBuilder(); in = getAssets().open("sample.xml"); Document doc = builder.parse(in); //Truy xuat phan tu goc <root> Element root = doc.getDocumentElement(); // Get <node> NodeList entryList = root.getElementsByTagName("node"); //Lay nut dau tien trong danh sach cac nut <node> Element nodeElement = (Element) entryList.item(0); // Gia tri luu tru o <node> String nodevalue = nodeElement.getFirstChild().getNodeValue(); Log.v(“DOM”, nodevalue); } catch (Exception e) { //Xử lý exception }
  • 23.
    23 XML Parsing ● Giớithiệu các phương pháp parse XML ● DOM ● SAX ● XmlPullParser
  • 24.
    24 XML Parsing ● SAX ●Các bước thực hiện: 1.Tạo event handler class, lớp này nhận callback từ SAXParser. 2. Tạo đối tượng SAXParserFactory và tạo đối tượng SAXParser. 3.Set event handler tạo ở bước 1 cho SAXParser. 4.Tiến hành parse xml bằng cách gọi phương thức SAXParser#parse 5.Mỗi khi một sự kiện xảy ra nó sẽ gọi callback tương ứng trong event handler được tạo ra ở bước 1.
  • 25.
    25 XML Parsing ● SAX ●Các bước thực hiện: 1.Tạo event handler class, lớp này nhận callback từ SAXParser:  Tạo class thừa kế từ class DefaultHandler.  Hiện thực các callback tương ứng với từng sự kiện:  Start tag → startElement  End tag → endElement  Text trong 1 tag → character
  • 26.
    26 XML Parsing ● SAXclass SaxHandler extends DefaultHandler { //Tag starting flag boolean isNode; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if ("node".equals(localName)) { // Start node tag isNode= true; } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if ("node".equals(localName)) { // End node tag isNode= false; } } @Override public void characters(char[] ch, int start, int length) throws SAXException { //If node tag is started, output text string to log if (isNode) { String nodevalue = new String(ch, start, length); Log.v(“SAX”, nodevalue); } } }
  • 27.
    27 XML Parsing ● SAX //Create factory of parse SAXParserFactory saxParaser = SAXParserFactory.newInstance(); Try { InputStream in = getAssets().open("sample.xml"); /* Get parser */ SAXParser sp = saxParaser.newSAXParser(); /* Create event handler */ SaxHandler sh = new SaxHandler(); /* Pass the input data and event handler to event handler */ sp.parse(in, sh); } catch (Exception e) { Log.e(“SAX”,”Error:”,e); }
  • 28.
    28 XML Parsing ● Giớithiệu các phương pháp parse XML. ● DOM ● SAX ● XmlPullParser
  • 29.
    29 XML Parsing ● XmlPullParser: ●Các bước để parse xml bằng XmlPullParser: – Tạo đối tượng XmlPullParser. – Truyền nội dung của tập tin XML cần parse cho parser. – Lấy được các sự kiện và phân tích.
  • 30.
    30 XML Parsing ● XmlPullParser: InputStreamin = null; try { // Get stream of analyzing target in = getAssets().open("sample.xml"); final XmlPullParser parser = Xml.newPullParser(); parser.setInput(new InputStreamReader(in)); parser.next(); // root tag parser.next(); // node tag String tag = parser.getName(); if ("node".equals(tag)) { parser.next(); String nodevalue = parser.getText(); Log.v(“XMLParser”, nodevalue); } } catch (Exception e) { //Xu ly exception }
  • 31.
    Nguyen Huu Phuoc,MEng. ●  Blog:http://folami.nghelong.com ●  Website http://phuocnh.nghelong.com