XML解析

XML介绍
XML: extensible markup language, 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。非常适合 Web 传输,常用来存储数据。
XML文件在Java的各种框架设计中应用非常广泛,常用来解藕。
在XML中,采用了如下的语法:
1、任何的起始标签都必须有一个结束标签。
2、可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标签。这种语法是在大于符号之前紧跟一个斜线(/),例如<tag/ >。XML解析器会将其翻译成<tag></tag>。
3、标签必须按合适的顺序进行嵌套,所以结束标签必须按镜像顺序匹配起始标签,例如this is a samplestring。这好比是将起始和结束标签看作是数学中的左右括号:在没有关闭所有的内部括号之前,是不能关闭外面的括号的。
4、所有的属性都必须有值。
5、所有的属性都必须在值的周围加上双引号。

XML解析概述
XML技术是Android平台的应用基础,Android提供了多种解析XML的方式。以下将介绍:SAX解析、DOM解析、PULL解析和JSON解析。

SAX解析XML
1.概述
SAX是Simple API for XML(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包下的类/接口:
1)Attributes接口:用于获取XML的属性值。
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(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:数组长度
4.使用步骤
步骤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
1. 概述
DOM(Document Object Model)是文档对象模型的缩写,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(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();
作用:获得当前属性的数据。
4.使用步骤
步骤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
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(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
4.使用步骤
步骤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解析
1. 概述
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}]"
提示:”表示一个双引号。
18.5.2.解析JSON的相关类
1、JSONObject类:存取一个JSON对象。
2、JSONArray类:存取一个JSON数组。
18.5.3.常用方法
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();
}

转载链接:http://blog.csdn.net/wangliang198901/article/details/14223303

原文地址:https://www.cnblogs.com/klcf0220/p/3472150.html