【鴻蒙】鴻蒙如何進行數(shù)據(jù)解析
【問題描述】有時候我們從服務(wù)器獲取是 xml 格式數(shù)據(jù),我們需要將 xml 轉(zhuǎn)化成 model 對象,該如何使用呢?下面舉個例子說明一下,將分以下幾步進行
1.準備條件 創(chuàng)建xml文件,創(chuàng)建model對象,構(gòu)建界面
2.數(shù)據(jù)進行解析操作(重點)
3.運行效果
第一步準備條件 創(chuàng)建 xml 文件,創(chuàng)建 model 對象,構(gòu)建界面
1.1 在 rawfile 新建 xml 文件,代碼如下
?xml version="1.0" encoding="utf-8"??>
George/to?>
John/from?>
Reminder/heading?>
Don't forget the meeting!/body?> /note?>
![wKgZomXTCWiAOM4KAAHN-csgQK0652.png](https://file1.elecfans.com/web2/M00/C0/2C/wKgZomXTCWiAOM4KAAHN-csgQK0652.png)
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 新建數(shù)據(jù)的 abilityslice,xml 如下
?xml version="1.0" encoding="utf-8"??>
/DirectionalLayout?>
界面效果如下
![wKgZomXTCemAX_9JAACGxXJw5uI462.png](https://file1.elecfans.com/web2/M00/C0/2D/wKgZomXTCemAX_9JAACGxXJw5uI462.png)
第二步數(shù)據(jù)解析 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 這個接口,下面是對這個接口方法的說明:
// 設(shè)置一個可以定位文檔內(nèi)容事件發(fā)生位置的定位器對象
public void setDocumentLocator(Locator locator)
// 用于處理文檔解析開始事件
public void startDocument()throws SAXException
// 處理元素開始事件,從參數(shù)中可以獲得元素所在名稱空間的 uri,元素名稱,屬性類表等信息
public void startElement(String namespacesURI , String localName , String qName , Attributes atts) throws SAXException
// 處理元素結(jié)束事件,從參數(shù)中可以獲得元素所在名稱空間的 uri,元素名稱等信息
public void endElement(String namespacesURI , String localName , String qName) throws SAXException
// 處理元素的字符內(nèi)容,從參數(shù)中可以獲得內(nèi)容
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;
/**
* 當讀取到文檔開始標志是觸發(fā),通常在這里完成一些初始化操作
*/
@Override
public void startDocument() throws SAXException {
mNote=new note();
}
/**
* 讀到一個開始標簽時調(diào)用,第二個參數(shù)為標簽名,最后一個參數(shù)為屬性數(shù)組
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.err.println("####===>>"+localName);
this.tagName = localName;
}
/**
* 讀到到內(nèi)容,第一個參數(shù)為字符串內(nèi)容,后面依次為起始位置與長度
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
//判斷當前標簽是否有效
if (this.tagName != null) {
String data = new String(ch, start, length);
//讀取標簽中的內(nèi)容
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);
}
}
}
/**
* 處理元素結(jié)束時觸發(fā),這里將對象添加到結(jié)合中
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
this.tagName = null;
}
/**
* 讀取到文檔結(jié)尾時觸發(fā),
*/
@Override
public void endDocument() throws SAXException {
super.endDocument();
System.err.println("#####===>>"+mNote.toString());
// Log.i("SAX", "讀取到文檔尾,xml解析結(jié)束");
}
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();
}
}
});
}
}
![wKgZomXTCEiAHW0bAACmJ-I8yS8707.png](https://file1.elecfans.com/web2/M00/C0/2C/wKgZomXTCEiAHW0bAACmJ-I8yS8707.png)
審核編輯 黃宇
-
XML
+關(guān)注
關(guān)注
0文章
188瀏覽量
33142 -
Model
+關(guān)注
關(guān)注
0文章
340瀏覽量
25137 -
鴻蒙
+關(guān)注
關(guān)注
57文章
2392瀏覽量
43059 -
HarmonyOS
+關(guān)注
關(guān)注
79文章
1982瀏覽量
30580
發(fā)布評論請先 登錄
相關(guān)推薦
XML在HarmonyOS中的生成,解析與轉(zhuǎn)換(下)
【HarmonyOS IPC 試用連載 】鴻蒙系統(tǒng)初步了解
【HarmonyOS HiSpark AI Camera試用連載 】鴻蒙JS UI介紹
請教鴻蒙應(yīng)用開發(fā)JAVA UI 框架ProgressBar或者RoundProgressBar怎么實現(xiàn)滑動調(diào)節(jié)
基于HarmonyOS Java UI使用元數(shù)據(jù)綁定框架實現(xiàn)UI和數(shù)據(jù)源的綁定
基于HarmonyOS Java UI,實現(xiàn)常見組件或者布局
鴻蒙應(yīng)用開發(fā)入門資料合集
鴻蒙應(yīng)用開發(fā)的JS UI框架如何實現(xiàn)高德地圖的訪問?
MTK自帶的XML解析
Java解析XML的一種數(shù)據(jù)綁定技術(shù)
java教程之GUI如何進行事件處理
![<b class='flag-5'>java</b>教程之GUI如<b class='flag-5'>何進行</b>事件處理](https://file.elecfans.com/web1/M00/65/C5/pIYBAFut802Ad7UjAAEcMs2Ij9g432.png)
鴻蒙版微信聊天UI效果實現(xiàn)!
![<b class='flag-5'>鴻蒙</b>版微信聊天<b class='flag-5'>UI</b>效果實現(xiàn)!](https://file.elecfans.com/web2/M00/1D/1F/pYYBAGGRuweAML4BAAAVAoIyepE699.png)
評論