XML解析详细介绍
在android开发中 有四种解析方式可以选择这个也是面试的时候常问到的问题 记得我第一次出去面试的时候面试官问我安卓四种解析方式哪一种更体现面向对象的思想? 四种解析方式的比较?相信今天大家看了我的介绍 会给大家一一解答的!
XML介绍
XML:extensiblemarkuplanguage,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。非常适合Web传输,常用来存储数据。
XML文件在Java的各种框架设计中应用非常广泛,常用来解藕。
在XML中,采用了如下的语法:
2、可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标签。这种语法是在大于符号之前紧跟一个斜线(/),例如<tag/>。XML解析器会将其翻译成<tag></tag>。
3、标签必须按合适的顺序进行嵌套,所以结束标签必须按镜像顺序匹配起始标签,例如thisisasamplestring。这好比是将起始和结束标签看作是数学中的左右括号:在没有关闭所有的内部括号之前,是不能关闭外面的括号的。
4、所有的属性都必须有值。
XML解析概述
XML技术是Android平台的应用基础,Android提供了多种解析XML的方式。以下将介绍:SAX解析、DOM解析、PULL解析和JSON解析。
SAX解析XML
1.概述
SAX是SimpleAPIforXML(XML简单的API)的缩写,SAX是一个解析速度快,占用内存少的XML解析器,并且SAX提供了一组简单的API用于解析XML文件。
SAX在解析XML文件前,先指定一个解析事件处理器(Handler),解析开始后,SAX会对XML文档进行简单的顺序扫描,当扫描到文档(Document)的开始和结束,还有元素Element的开始和标记Tag的开始和结束时,会给之前指定的解析事件处理器发送消息,由处理器来处理相应的事件。当XML文档扫描完毕,则整个解析过程结束。
2.相关类/接口
1、javax.xml.parsers包下的类/接口:
1)SAXParserFactory类:SAX解析器工厂类,用于创建SAX解析器实例。
2)SAXParser:SAX解析器,用于对XML文档进行解析。
3)ParserConfigurationException:解析器配置异常。
2、org.xml.sax包下的类/接口:
2)SAXException:封装了一个通用的SAX错误警告
3、org.xml.sax.helpers包下的接口:
1)DefaultHandler类:SAX解析事件处理器。
3.常用方法
1、SAXParserFactory.newInstance();
作用:创建SAXParserFactory工厂对象。
2、SAXParserFactory.newSAXParser();
作用:创建SAXParser解析器对象。
3、DefaultHandler.startDocument()
作用:XML文档开始处触发本方法。
4、DefaultHandler.endDocument()
作用:XML文档结束时触发本方法。
5、DefaultHandler.startElement(Stringuri,StringlocalName,StringqName,
Attributesattributes)
作用:元素开始处触发本方法。
参数:
(1)uri:命名空间。
(2)localName:不带命名空间的标签名。
(3)qName:带命名空间的标签名。
6、DefaultHandler.endElement(Stringuri,StringqName);
作用:元素结束时触发本方法。
7、DefaultHandler.characters(char[]ch,intstart,intlength);
参数:
(1)-ch:内容。
(2)-start:数组元素的位置。
(3)-length:数组长度
4.使用步骤
步骤1、创建SAX解析器的工厂对象,示例代码:
SAXParserFactoryfactory=SAXParserFactory.newInstance();
步骤2、创建SAX解析器对象,示例代码:
SAXParsersaxParse=factory.newSAXParser();
步骤3、创建并打开输入流对象,示例代码:
InputStreamis=getAssets().open("strings.xml");
提示:以上打开的是assets/string.xml。assets文件夹中存放的资源不会在R.java中创建资源索引值,这与res文件夹不同。
步骤4、创建SAX事件处理器对象
DefaultHandlerdh=newDefaultHandler(){
//重写该类中的方法
publicvoidstartElement(Stringuri,
StringqName,AttributesattributesthrowsSAXException{
super.startElement(uri,localName,qName,attributes);
//在此处编写代码
}
@Override
publicvoidcharacters(char[]ch,intstart,intlength)
throwsSAXException{
super.characters(ch,start,length);
//在此处编写代码
}
}
saxParse.parse(is,dh);
DOM解析XML
1.概述
DOM(DocumentObjectModel)是文档对象模型的缩写,DOM提供了一套用于解析XML文档的API,DOM会按照XML定义的标记块来创建对象实例并设置相应的属性,而且还可按照标记块的层次结构来构建对象的层次结构。
2.相关类/接口
Android提供了javax.xml.parsers和org.w3c.dom两个包用于DOM方式解析XML文档。
1、DocumentBuilderFactory类:DOM文档解析器的工厂类,用于创建解析器对象。
2、DocumentBuilder类:DOM文档解析器类,用于解析XML文档。
3、Document:文档实体接口。
4、Element类:代表文档的一个元素。
5、Node类:代表DOM模型中的实体的主要数据类型,既可以是元素也可以是属性项。
6、NodeList类:节点列表。
3.常用方法
1、DocumentBuilderFactory.newInstance();
作用:创建文档模型工厂对象。
2、DocumentBuilderFactory.newDocumentBuilder();
作用:创建解析器对象。
3、DocumentBuilder.parse(InputStreamis);
作用:将输入流代表的XML文档加载到内存中。
4、DocumentBuilder.getDocumentElement();
作用:获得根元素。
5、Element.getChildNodes();
作用:获得当前元素的所有子节点元素。该方法返回一个NodeList类型的对象。
6、NodeList.item(i);
作用:返回节点列表中索引值为i的列表项。
7、Node.getNodeType();
作用:获得节点类型。
8、Element.getAttribute(Strings);
9、Element.getFirstChild().getNodeValue();
作用:获得当前属性的数据。
4.使用步骤
步骤1、创建DOM解析器工厂对象,示例代码:
DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
步骤2、创建DOM解析器对象,示例代码:
DocumentBuilderbuilder=factory.newDocumentBuilder();
步骤3、创建输入流对象,示例代码:
InputStreamis=getAssets().open("main.xml");
步骤4、将整个XML文档加载到内存,示例代码:
Documentparse=builder.parse(is);
Elementroot=parse.getDocumentElement();
步骤6、获得所有的子节点,示例代码:
NodeListnodes=root.getChildNodes();
步骤7、依次获取每个子节点
for(inti=0;i<nodes.getLength();i++){
//7.1.获得每个子节点
Nodeitem=nodes.item(i);
//7.2.判断元素类型是否是节点
if(Node.ELEMENT_NODE==item.getNodeType()){
//7.2.1.将元素转换为节点
Elementelement=(Element)item;
//7.2.2.获得当前节点的所有子节点
NodeListsubNodes=element.getChildNodes();
//7.2.3.依次获取当前各子节点
for(intj=0;j<subNodes.getLength();j++){
//7.2.3.1.获取当前子节点
Nodeitem2=subNodes.item(j);
//7.2.3.2.若节点类型是元素
if(Node.ELEMENT_NODE==item2.getNodeType()){
//7.2.3.2.1转换为元素类型
Elementelement2=(Element)item2;
//7.2.3.2.2.编写完成具体任务需求的代码
}//endif
}//endfor
}//endif
}//endfor
PULL解析XML
1.概述
Pull解析器是一个开源的Java项目,Android系统内部解析XML文件均为此种方式。Pull解析和Sax解析很相似,都是轻量级的解析。在Android的内核中已经嵌入了Pull,所以不需要再添加第三方jar包来支持Pull。
Pull解析和Sax解析不一样的地方有:
1)Pull读取XML文件后触发相应的事件调用方法返回的是数字
2)Pull可以在程序中控制想解析到哪里就可以停止解析
Android系统推荐使用Pull解析XML文档。
2.相关类/接口
Android提供了org.xmlpull.vl包支持PULL方式解析。以下是相关类/接口。
1、XmlPullFactory类:解析器工厂类,用于创建解析器对象。
2、XmlPullParser类:解析器类,用于解析XML文档。
3.常用方法
1、XmlPullParser.setInput(InputStreaminputStream,StringinputEncoding);
作用:设置需要解析的输入流对象。
第一个参数-inputStream:输入流对象。
第二个参数-inputEncoding:xml文件的编码格式
2、intXmlPullParser.getEventType();
作用:返回当前事件的类型值,常用事件类型值:
(1)XmlPullParser.START_DOCUMENT文档开始
(2)XmlPullParser.END_DOCUMENT:文档结束
(3)XmlPullParser.START_TAG:标签开始
(4))XmlPullParser.END_TAG:标签结束
3、XmlPullParser.next();
作用:获取下一个解析器事件。
4、XmlPullParser.getName();
作用:返回当前元素名。
5、XmlPullParser.getAttributeValue(intindex);
作用:返回当前元素指定索引值的属性名。
<TextView
android:text="text"
android:layout_width="fill_parent"
android:layout_height="wrap_content">textview
</TextView>
则:
parser.getName()的值是TextView,
parser.getAttributeValue(0)值是text
parser.getAttributeValue(1)值是fill_parent
parser.getAttributeValue(2)值是"wrap_content
4.使用步骤
步骤1、创建解析器工厂对象,示例代码:
factory=XmlPullParserFactory.newInstance();
步骤2、创建解析器对象,示例代码:
XmlPullParserparser=factory.newPullParser();
XmlPullParserparser=Xml.newPullParser();
InputStreamis=getAssets().open("main.xml");
步骤4、设置解析器操作的输入流对象并设置编码格式,示例代码:
parser.setInput(is,"utf-8");
步骤5、以下循环依次读取XML文档中的每个节点,示例代码:
for(inttype=parser.getEventType();
type!=XmlPullParser.END_DOCUMENT;
type=parser.next()){
StringtagName=parser.getName();//获取当前节点的名称
……
}
JSON解析
1.概述
JSON:JavaScript对象表示法(JavaScriptObjectNotation)。
JSON是存储和交换文本信息的语法。类似XML。
JSON比XML更小、更快,更易解析。
JSON采用键/值对的形式存储数据。
JSON用{}存放一个JSON对象,示例:
{“name”:”张兰兰”,”sex”:false,”age”:28,”}
JSON用[]存放一个JSON数组,示例:
"[{\"name\":张兰兰,\"sex\":false,\"age\":23},"+
"{\"name\":李斯斯,\"age\":22},"+
"{\"name\":王五五,\"sex\":true,\"age\":25}]"
提示:\”表示一个双引号。
18.5.2.解析JSON的相关类
1、JSONObject类:存取一个JSON对象。
2、JSONArray类:存取一个JSON数组。
18.5.3.常用方法
1、JSONObject.put(Stringname,Objectvalue);
作用:存放一个键/值对,键必须是String,值可以是int、boolean、String或Object类型。
示例:
JSONObjectjsonObject=newJSONObject();
jsonObject.put(“name”,”张兰兰”);
2、JSONArray.getJSONObject(intindex);
作用:获取数组中指定索引值的JSON对象。
示例:
StringjsonStr=
"[{\"name\":张兰兰,"+
"{\"name\":李斯斯,"+
"{\"name\":王五五,\"age\":25}]";
try{
JSONArrayjsonArr=newJSONArray(jsonStr);
JSONObjectjsonObj=jsonArr.getJSONObject(2);
mTextView.setText(jsonObj.toString());
}catch(JSONExceptione){
e.printStackTrace();
}