【鸿蒙】鸿蒙如何进行数据解析

【问题形容】有时候咱们从服务器获取是xml格局数据,咱们须要将xml转化成model对象,该如何应用呢?上面举个例子阐明一下,将分以下几步进行

  1. 筹备条件 创立xml文件,创立model对象,构建界面
  2. 数据进行解析操作(重点)
  3. 运行成果

第一步筹备条件 创立xml文件,创立model对象,构建界面

1.1在rawfile 新建xml文件,代码如下

<?xml version="1.0" encoding="utf-8"?><note>    <to>George</to>    <from>John</from>    <heading>Reminder</heading>    <body>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    xmlns:ohos="http://schemas.huawei.com/res/ohos"    ohos:height="match_parent"    ohos:width="match_parent"    ohos:orientation="vertical">    <Text        ohos:id="$+id:mStartParse"        ohos:height="100vp"        ohos:width="match_parent"        ohos:text="开始解析"        ohos:text_size="20fp"        ohos:text_color="#ffffff"        ohos:text_alignment="center"        ohos:background_element="#ed6262"/>    <Text        ohos:id="$+id:mTo"        ohos:height="100fp"        ohos:width="match_parent"        ohos:text_size="20fp"        ohos:text_color="#ed6262"        ohos:background_element="#ffffff"/>    <Text        ohos:id="$+id:mfrom"        ohos:height="100fp"        ohos:width="match_parent"        ohos:text_size="20fp"        ohos:text_color="#ed6262"        ohos:background_element="#ffffff"/>    <Text        ohos:id="$+id:mheading"        ohos:height="100fp"        ohos:width="match_parent"        ohos:text_size="20fp"        ohos:text_color="#ed6262"        ohos:background_element="#ffffff"/>     <Text        ohos:id="$+id:mbody"        ohos:height="100fp"        ohos:width="match_parent"        ohos:text_size="20fp"        ohos:text_color="#ed6262"        ohos:background_element="#ffffff"/> </DirectionalLayout>

界面成果如下

第二步数据解析
2.1参考资料如下

SAXParser

https://developer.harmonyos.c...

XMLReader
https://developer.harmonyos.c...
该性能和Android的demo类似能够参考Android的demo链接

https://blog.csdn.net/bzlj291...

在上述四个接口中,最重要的就是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();                }            }        });    }}

第三步运行成果如下

更多精彩内容,请见华为开发者官方论坛→https://developer.huawei.com/...