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