【鴻蒙】鴻蒙如何進行數據解析
【問題描述】有時候我們從服務器獲取是 xml 格式數據,我們需要將 xml 轉化成 model 對象,該如何使用呢?下面舉個例子說明一下,將分以下幾步進行
1.準備條件 創建xml文件,創建model對象,構建界面
2.數據進行解析操作(重點)
3.運行效果
第一步準備條件 創建 xml 文件,創建 model 對象,構建界面
1.1 在 rawfile 新建 xml 文件,代碼如下
?xml version="1.0" encoding="utf-8"??>
George/to?>
John/from?>
Reminder/heading?>
Don't forget the meeting!/body?> /note?>
1.2 新建 class model 代碼如下
package com.harmony.alliance.mydemo.model;
public class note {
private String from;
private String heading;
private String body;
private String to;
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
public String getHeading() {
return heading;
}
public void setHeading(String heading) {
this.heading = heading;
}
@Override
public String toString() {
return "note{" +
"from='" + from + ''' +
", heading='" + heading + ''' +
", body='" + body + ''' +
", to='" + to + ''' +
'}';
}
}
1.3 新建數據的 abilityslice,xml 如下
?xml version="1.0" encoding="utf-8"??>
/DirectionalLayout?>
界面效果如下
第二步數據解析 2.1 參考資料如下
SAXParser
https://developer.harmonyos.com/cn/docs/documentation/doc-references/saxparser-0000001060039145
XMLReader https://developer.harmonyos.com/cn/docs/documentation/doc-references/xmlreader-0000001060837300
在上述四個接口中,最重要的就是 ContentHandler 這個接口,下面是對這個接口方法的說明:
// 設置一個可以定位文檔內容事件發生位置的定位器對象
public void setDocumentLocator(Locator locator)
// 用于處理文檔解析開始事件
public void startDocument()throws SAXException
// 處理元素開始事件,從參數中可以獲得元素所在名稱空間的 uri,元素名稱,屬性類表等信息
public void startElement(String namespacesURI , String localName , String qName , Attributes atts) throws SAXException
// 處理元素結束事件,從參數中可以獲得元素所在名稱空間的 uri,元素名稱等信息
public void endElement(String namespacesURI , String localName , String qName) throws SAXException
// 處理元素的字符內容,從參數中可以獲得內容
public void characters(char[] ch , int start , int length) throws SAXException
新建 SaxHelper 代碼如下
package com.harmony.alliance.mydemo.model;
import ohos.org.xml.sax.Attributes;
import ohos.org.xml.sax.SAXException;
import ohos.org.xml.sax.helpers.DefaultHandler;
/**
* Created by Jay on 2015/9/8 0008.
*/
public class SaxHelper extends DefaultHandler {
//當前解析的元素標簽
private String tagName = null;
private note mNote;
/**
* 當讀取到文檔開始標志是觸發,通常在這里完成一些初始化操作
*/
@Override
public void startDocument() throws SAXException {
mNote=new note();
}
/**
* 讀到一個開始標簽時調用,第二個參數為標簽名,最后一個參數為屬性數組
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.err.println("####===>>"+localName);
this.tagName = localName;
}
/**
* 讀到到內容,第一個參數為字符串內容,后面依次為起始位置與長度
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
//判斷當前標簽是否有效
if (this.tagName != null) {
String data = new String(ch, start, length);
//讀取標簽中的內容
if (this.tagName.equals("to")) {
mNote.setTo(data);
} else if (this.tagName.equals("from")) {
mNote.setFrom(data);
}else if(this.tagName.equals("heading")){
mNote.setHeading(data);
}else if(this.tagName.equals("body")){
mNote.setBody(data);
}
}
}
/**
* 處理元素結束時觸發,這里將對象添加到結合中
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
this.tagName = null;
}
/**
* 讀取到文檔結尾時觸發,
*/
@Override
public void endDocument() throws SAXException {
super.endDocument();
System.err.println("#####===>>"+mNote.toString());
// Log.i("SAX", "讀取到文檔尾,xml解析結束");
}
public note getmNote() {
return mNote;
}
}
AbilitySlice 代碼如下
package com.harmony.alliance.mydemo.slice;
import com.harmony.alliance.mydemo.ResourceTable;
import com.harmony.alliance.mydemo.model.SaxHelper;
import com.harmony.alliance.mydemo.model.note;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Component;
import ohos.agp.components.Text;
import ohos.javax.xml.parsers.SAXParser;
import ohos.javax.xml.parsers.SAXParserFactory;
import ohos.org.xml.sax.InputSource;
import ohos.org.xml.sax.XMLReader;
import java.io.InputStream;
import java.util.Locale;
public class myXmlParseAbilitySlice extends AbilitySlice {
private Text mStartParse,mTo,mfrom,mheading,mbody;
@Override
protected void onStart(Intent intent) {
super.onStart(intent);
setUIContent(ResourceTable.Layout_my_xml_parse);
mStartParse= (Text) findComponentById(ResourceTable.Id_mStartParse);
mTo= (Text) findComponentById(ResourceTable.Id_mTo);
mfrom= (Text) findComponentById(ResourceTable.Id_mfrom);
mheading= (Text) findComponentById(ResourceTable.Id_mheading);
mbody= (Text) findComponentById(ResourceTable.Id_mbody);
mStartParse.setClickedListener(new Component.ClickedListener() {
@Override
public void onClick(Component component) {
try {
String rawFilePath = "note.xml";
String filePath = String.format(Locale.ROOT, "assets/entry/resources/rawfile/%s", rawFilePath);
InputStream is = this.getClass().getClassLoader().getResourceAsStream(filePath);
InputSource is2=new InputSource(is);
SaxHelper ss = new SaxHelper();
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
SAXParser parser = factory.newSAXParser();
XMLReader xmlReader=parser.getXMLReader();
xmlReader.setContentHandler(ss);
xmlReader.parse(is2);
note mNote= ss.getmNote();
mTo.setText("to: "+mNote.getTo());
mfrom.setText("From: "+mNote.getFrom());
mheading.setText("heading: "+mNote.getHeading());
mbody.setText("body: "+mNote.getBody());
is.close();
}catch (Exception e){
e.printStackTrace();
}
}
});
}
}
審核編輯 黃宇
-
XML
+關注
關注
0文章
188瀏覽量
33104 -
Model
+關注
關注
0文章
340瀏覽量
25086 -
鴻蒙
+關注
關注
57文章
2370瀏覽量
42902 -
HarmonyOS
+關注
關注
79文章
1980瀏覽量
30282
發布評論請先 登錄
相關推薦
評論