Android xml文件序列化,Android序列化:XML简介 & 解析方式对比(DOM、SAX、PULL)

e636f4f8487b

目录

e636f4f8487b

示意图

1. 定义

XML,即 extensible Markup Language ,是一种数据标记语言 & 传输格式

2. 作用

对数据进行标记(结构化数据)、存储 & 传输

区别于 html :html用于显示信息;而 XML用于存储&传输信息

3. 特点

e636f4f8487b

示意图

4. 语法

元素要关闭标签

< p >this is a bitch

对大小写敏感

< P >这是错误的

< p >这是正确的

必须要有根元素(父元素)

属性值必须加引号

实体引用

实体引用

符号

含义

&lt;

<

小于

&gt ;

>

大于

&amp;

&

和浩

&apos;

单引号

&quot;

"

双引号

元素不能使用&(实体的开始)和

注释

``

XML的元素、属性和属性值

文档实例

Harry Potter

JK.Rowling

woshiPM

Carson_Ho

其中,是根元素;是子元素,也是元素类型之一;而中含有属性,即category,属性值是CHILDREN;而元素则拥有文本内容( JK.Rowling)

元素与属性的差别

属性即提供元素额外的信息,但不属于数据组成部分的信息。

范例一

Harry Potter

JK.Rowling

范例二

CHILDREN

Harry Potter

JK.Rowling

范例一和二提供的信息是完全相同的。

一般情况下,请使用元素,因为

属性无法描述树结构(元素可以)

属性不容易拓展(元素可以)

使用属性的情况:用于分配ID索引,用于标识XML元素。

实例

CHILDREN

Harry Potter

JK.Rowling

CHILDREN

Harry Potter

JK.Rowling

上述属性(id)仅用于标识不同的便签,并不是数据的组成部分

XML元素命名规则

不能以数字或标点符号开头

不能包含空格

不能以xml开头

CDATA

不被解析器解析的文本数据,所有xml文档都会被解析器解析(cdata区段除外)

PCDATA

被解析的字符数据

5. XML树结构

XML文档中的元素会形成一种树结构,从根部开始,然后拓展到每个树叶(节点),下面将以实例说明XML的树结构。

假设一个XML文件如下

简历>

其树结构如下

e636f4f8487b

树结构 .png

XML节点解释

XML文件是由节点构成的。它的第一个节点为“根节点”。一个XML文件必须有且只能有一个根节点,其他节点都必须是它的子节点。

e636f4f8487b

this 代表整个XML文件,它的根节点就是 this.firstChild 。 this.firstChild.childNodes 则返回由根节点的所有子节点组成的节点数组。

e636f4f8487b

每个子节点又可以有自己的子节点。节点编号由0开始,根节点的第一个子节点为 this.firstChild.childNodes[0],它的子节点数组就是this.firstChild.childNodes[0].childNodes 。

e636f4f8487b

根节点第一个子节点的第二个子节点 this.firstChild.childNodes[0].childNodes[1],它返回的是一个XML对象(Object) 。这里需要特别注意,节点标签之间的数据本身也视为一个节点 this.firstChild.childNodes[0].childNodes[1].firstChild ,而不是一个值。

e636f4f8487b

我们解析XML的最终目的当然就是获得数据的值:this.firstChild.childNodes[0].childNodes[1].firstChild.nodeValue 。

请注意区分:节点名称(性别>)和之间的文本内容(男)可以当作是节点,也可以当作是一个值

节点:

名称:this.firstChild.childNodes[0].childNodes[1]

文本内容:this.firstChild.childNodes[0].childNodes[1].firstChild

值:

名称:this.firstChild.childNodes[0].childNodes[1].nodeValue

(节点名称有时也是我们需要的数据)

文本内容:this.firstChild.childNodes[0].childNodes[1].nodeName

在了解完XML之后,是时候来学下如何进行XML的解析了

6. 解析方式

解析XML,即从XML中提取有用的信息

XML的解析方式主要分为2大类:

e636f4f8487b

示意图

6.1 DOM方式

简介

Document Object Model,即 文件对象模型,是 一种 基于树形结构节点 & 文档驱动 的XML解析方法

定义了访问 & 操作xml文档元素的方法和接口

解析原理

e636f4f8487b

示意图

具体解析实例

// 假设需要解析的XML文档如下(subject.xml)

`

Java

Android

Swift#

iOS

Html5

Web

// 解析的核心代码

public static List getSubjectList(InputStream stream)

{ tv = (TextView)findViewById(R.id.tv);

try {

//打开xml文件到输入流

InputStream stream = getAssets().open("subject.xml");

//得到 DocumentBuilderFactory 对象

DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();

//得到DocumentBuilder对象

DocumentBuilder builder = builderFactory.newDocumentBuilder();

//建立Document存放整个xml的Document对象数据

Document document = builder.parse(stream);

//得到 XML数据的"根节点"

Element element = document.getDocumentElement();

//获取根节点的所有language的节点

NodeList list = element.getElementsByTagName("language");

//遍历所有节点

for (int i= 0;i<=list.getLength();i++){

//获取lan的所有子元素

Element language = (Element) list.item(i);

//获取language的属性(这里即为id)并显示

tv.append(lan.getAttribute("id")+"\n");

//获取language的子元素 name 并显示 tv.append(sub.getElementsByTagName("name").item(0).getTextContent()+"\n");

//获取language的子元素usage 并显示 tv.append(sub.getElementsByTagName("usage").item(0).getTextContent()+"\n");

}

特点 & 应用场景

e636f4f8487b

示意图

6.2 SAX 方式

简介

即 Simple API for XML,一种 基于事件流驱动、通过接口方法解析 的XML解析方法

解析原理

e636f4f8487b

示意图

解析实例

在使用SAX解析XML文档时,关键在于 自定义自己的Handler处理类 & 复写对应方法

public class MyHandler extends DefaultHandler{

@Override

public void startDocument() throws SAXException{

}

@Override

public void startElement(String uri,String localName,String qName,

Attributes attributes) throws SAXException{

}

@Override

public void characters(char[] ch,int start,int length) throws SAXException{

}

@Override

public void endElement(String uri,String localName,String qName)

throws SAXException{

}

@Override

public void endDocument() throws SAXException{

}

}

特点 & 应用场景

e636f4f8487b

示意图

6.3 PULL解析

简介

一种 基于事件流驱动 的XML解析方法

解析原理

e636f4f8487b

示意图

解析模板代码

注:Android中自带了Pull解析的jar包,故不需额外导入第三方jar包

// Pull使用循环解析

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();

XmlPullParser xmlPullParser = factory.newPullParser();

xml.setInput(new StringReader(xmlData));

int eventType = xmlPullParser.getEventType();

while(eventType!=XmlPullParser.END_DOCUMENT){

String nodeName = xmlPullParser.getName();

switch(eventType){

case XmlPullParser.START_DOCUMENT:{}

case XmlPullParser.START_TAG:{}

case XmlPullParser.END_TAG:{}

}

eventType = parser.next();

}

解析实例

public class MainActivity extends Activity {

private EditText et;

private Button myButton;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

myButton = (Button) this.findViewById(R.id.btn01);

et = (EditText) this.findViewById(R.id.edittext01);

myButton.setOnClickListener(new OnClickListener() {

//可变字符序列,比StringBuffer块

StringBuilder sb = new StringBuilder("");

Resources res = getResources();

XmlResourceParser xrp = res.getXml(R.xml.subject);

@Override

public void onClick(View v) {

int counter = 0;

try {

// 判断是否到了文件的结尾

while (xrp.getEventType() != XmlPullParser.END_DOCUMENT) {

//文件的内容的起始标签开始,这里的起始标签是subject.xml文件里面标签下面的第一个标签

int eventType=xrp.getEventType();

switch (eventType) {

case XmlPullParser.START_DOCUMENT:

break;

case XmlPullParser.START_TAG:

String tagname = xrp.getName();

if (tagname.endsWith("language")) {

counter++;

sb.append("这是第" + counter + "种语言"+"\n");

//可以调用XmlPullParser的getAttributte()方法来获取属性的值

sb.append("语言id是:"+xrp.getAttributeValue(0)+"\n");

}

else if(tagname.equals("name")){

//可以调用XmlPullParser的nextText()方法来获取节点的值

sb.append("语言名称是:"+xrp.nextText()+"\n");

}

else if(tagname.equals("teacher")){

sb.append("用途是:"+xrp.nextText()+"\n");

}

break;

case XmlPullParser.END_TAG:

break;

case XmlPullParser.TEXT:

break;

}

//解析下一个事件

xrp.next();

}

//StringBuilder要调用toString()方法并显示

et.setText(sb.toString());

} catch (XmlPullParserException e) {

} catch (IOException e) {

e.printStackTrace();

}

}

});

}

特点 & 应用场景

e636f4f8487b

示意图

6.4 解析方式对比

e636f4f8487b

示意图

7. 总结

本文全面介绍了现今主流的数据传输格式 XML,下面用一张图总结XML的主流解析方法

e636f4f8487b

示意图

关于另外1种主流的数据传输格式 JSON,具体请看文章Android:JSON 简介 & 解析方式 讲解

下面我将继续对 Android中的知识进行深入讲解 ,感兴趣的同学可以继续关注本人运营的Wechat Public Account:

请点赞!因为你的鼓励是我写作的最大动力!

不定期分享关于安卓开发的干货,追求短、平、快,但却不缺深度。

e636f4f8487b

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值