Android - Trình phân tích cú pháp XML
XML là viết tắt của Extensible Mark-up Language.XML là một định dạng rất phổ biến và thường được sử dụng để chia sẻ dữ liệu trên internet. Chương này giải thích cách phân tích cú pháp tệp XML và trích xuất thông tin cần thiết từ nó.
Android cung cấp ba loại trình phân tích cú pháp XML là DOM,SAX and XMLPullParser. Trong số tất cả chúng, android khuyên dùng XMLPullParser vì nó hiệu quả và dễ sử dụng. Vì vậy, chúng ta sẽ sử dụng XMLPullParser để phân tích cú pháp XML.
Bước đầu tiên là xác định các trường trong dữ liệu XML mà bạn quan tâm. Ví dụ: Trong XML đưa ra dưới đây, chúng tôi chỉ quan tâm đến việc nhận nhiệt độ.
<?xml version="1.0"?>
<current>
<city id="2643743" name="London">
<coord lon="-0.12574" lat="51.50853"/>
<country>GB</country>
<sun rise="2013-10-08T06:13:56" set="2013-10-08T17:21:45"/>
</city>
<temperature value="289.54" min="289.15" max="290.15" unit="kelvin"/>
<humidity value="77" unit="%"/>
<pressure value="1025" unit="hPa"/>
</current>
XML - Phần tử
Một tệp xml bao gồm nhiều thành phần. Đây là bảng xác định các thành phần của tệp XML và mô tả của chúng.
Sr.No | Thành phần & mô tả |
---|---|
1 | Prolog Tệp XML bắt đầu bằng một đoạn mở đầu. Dòng đầu tiên chứa thông tin về tệp là prolog |
2 | Events Một tệp XML có nhiều sự kiện. Sự kiện có thể như thế này. Tài liệu bắt đầu, Tài liệu kết thúc, Bắt đầu thẻ, Kết thúc thẻ và Văn bản, v.v. |
3 | Text Ngoài các thẻ và sự kiện, tệp xml cũng chứa văn bản đơn giản. Nhu laGB là một văn bản trong thẻ quốc gia. |
4 | Attributes Thuộc tính là các thuộc tính bổ sung của thẻ như giá trị, v.v. |
XML - Phân tích cú pháp
Trong bước tiếp theo, chúng ta sẽ tạo đối tượng XMLPullParser, nhưng để tạo đối tượng đó, trước tiên chúng ta sẽ tạo đối tượng XmlPullParserFactory và sau đó gọi phương thức newPullParser () của nó để tạo XMLPullParser. Cú pháp của nó được đưa ra dưới đây:
private XmlPullParserFactory xmlFactoryObject = XmlPullParserFactory.newInstance();
private XmlPullParser myparser = xmlFactoryObject.newPullParser();
Bước tiếp theo liên quan đến việc chỉ định tệp cho XmlPullParser có chứa XML. Nó có thể là một tệp hoặc có thể là một Luồng. Trong trường hợp của chúng tôi, nó là một luồng, cú pháp của nó được đưa ra dưới đây:
myparser.setInput(stream, null);
Bước cuối cùng là phân tích cú pháp XML. Một tệp XML bao gồm các sự kiện, Tên, Văn bản, Thuộc tính, Giá trị, v.v ... Vì vậy, XMLPullParser có một chức năng riêng để phân tích cú pháp từng thành phần của tệp XML. Cú pháp của nó được đưa ra dưới đây:
int event = myParser.getEventType();
while (event != XmlPullParser.END_DOCUMENT) {
String name=myParser.getName();
switch (event){
case XmlPullParser.START_TAG:
break;
case XmlPullParser.END_TAG:
if(name.equals("temperature")){
temperature = myParser.getAttributeValue(null,"value");
}
break;
}
event = myParser.next();
}
Phương pháp getEventTypetrả về loại sự kiện xảy ra. ví dụ: Bắt đầu tài liệu, bắt đầu thẻ, v.v. Phương phápgetName trả về tên của thẻ và vì chúng tôi chỉ quan tâm đến nhiệt độ, vì vậy chúng tôi chỉ cần kiểm tra trong câu lệnh điều kiện rằng nếu chúng tôi có thẻ nhiệt độ, chúng tôi gọi phương thức getAttributeValue để trả lại cho chúng tôi giá trị của thẻ nhiệt độ.
Ngoài các phương thức này, lớp này còn cung cấp các phương thức khác để phân tích cú pháp tệp XML tốt hơn. Các phương pháp này được liệt kê bên dưới -
Sr.No | Phương pháp & mô tả |
---|---|
1 | getAttributeCount() Phương thức này chỉ Trả về số thuộc tính của thẻ bắt đầu hiện tại |
2 | getAttributeName(int index) Phương thức này trả về tên của thuộc tính được chỉ định bởi giá trị chỉ mục |
3 | getColumnNumber() Phương thức này trả về Trả về số cột hiện tại, bắt đầu từ 0. |
4 | getDepth() Phương thức này trả về Trả về độ sâu hiện tại của phần tử. |
5 | getLineNumber() Trả về số dòng hiện tại, bắt đầu từ 1. |
6 | getNamespace() Phương thức này trả về URI không gian tên của phần tử hiện tại. |
7 | getPrefix() Phương thức này trả về tiền tố của phần tử hiện tại |
số 8 | getName() Phương thức này trả về tên của thẻ |
9 | getText() Phương thức này trả về văn bản cho phần tử cụ thể đó |
10 | isWhitespace() Phương pháp này kiểm tra xem sự kiện TEXT hiện tại chỉ chứa các ký tự khoảng trắng hay không. |
Thí dụ
Dưới đây là một ví dụ minh họa việc sử dụng Trình phân tích cú pháp DOM XML. Nó tạo ra một ứng dụng cơ bản cho phép bạn phân tích cú pháp XML.
Để thử nghiệm với ví dụ này, bạn có thể chạy điều này trên thiết bị thực tế hoặc trong trình giả lập.
Các bước | Sự miêu tả |
---|---|
1 | Bạn sẽ sử dụng Android studio để tạo ứng dụng Android theo gói com.example.sairamkrishna.myapplication. |
2 | Sửa đổi tệp src / MainActivity.java để thêm mã cần thiết. |
3 | Sửa đổi res / layout / activity_main để thêm các thành phần XML tương ứng |
4 | Tạo tệp XML mới trong Thư mục tài sản / file.xml |
5 | Sửa đổi AndroidManifest.xml để thêm quyền truy cập Internet cần thiết |
6 | Chạy ứng dụng và chọn một thiết bị Android đang chạy và cài đặt ứng dụng trên đó và xác minh kết quả |
Sau đây là nội dung của tệp hoạt động chính được sửa đổi MainActivity.java.
package com.example.sairamkrishna.myapplication;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
TextView tv1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv1=(TextView)findViewById(R.id.textView1);
try {
InputStream is = getAssets().open("file.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(is);
Element element=doc.getDocumentElement();
element.normalize();
NodeList nList = doc.getElementsByTagName("employee");
for (int i=0; i<nList.getLength(); i++) {
Node node = nList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element2 = (Element) node;
tv1.setText(tv1.getText()+"\nName : " + getValue("name", element2)+"\n");
tv1.setText(tv1.getText()+"Surname : " + getValue("surname", element2)+"\n");
tv1.setText(tv1.getText()+"-----------------------");
}
}
} catch (Exception e) {e.printStackTrace();}
}
private static String getValue(String tag, Element element) {
NodeList nodeList = element.getElementsByTagName(tag).item(0).getChildNodes();
Node node = nodeList.item(0);
return node.getNodeValue();
}
}
Sau đây là nội dung của Assets/file.xml.
<?xml version="1.0"?>
<records>
<employee>
<name>Sairamkrishna</name>
<surname>Mammahe</surname>
<salary>50000</salary>
</employee>
<employee>
<name>Gopal </name>
<surname>Varma</surname>
<salary>60000</salary>
</employee>
<employee>
<name>Raja</name>
<surname>Hr</surname>
<salary>70000</salary>
</employee>
</records>
Sau đây là nội dung sửa đổi của xml res/layout/activity_main.xml.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
Sau đây là nội dung của AndroidManifest.xml tập tin.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sairamkrishna.myapplication" >
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Hãy thử chạy ứng dụng mà chúng tôi vừa sửa đổi. Tôi cho rằng bạn đã tạo raAVDtrong khi thiết lập môi trường. Để chạy ứng dụng từ Android studio, hãy mở một trong các tệp hoạt động của dự án của bạn và nhấp vào