1.Xml的用处
用来存储结构性数据,并且用来进行网络传输。
首先,xml是一种文件格式,作为文件它可以通过网络(io流)进行传输;另外,它以结构化方式来存储这些数据,遵守具体规范,那么就可以通过算法对它进行解析,并得到我们所需的数据。
2.Xml构成
xml称为可扩展性标记语言,标记语言就是通过标签方式来标识内容,怎么做目的,就是为内容起一个名字,然后通过名字的自定义带来的易定位和易操作性来代替直接对数据处理,就好象编程中用变量来存储数据或者用键和值建立映射关系,它与html是非常相似的,而不同之处在于所谓的可扩展性,它的标签名是完全可以自定义的,没有预定义相关关键字。
另外,它可以嵌套的方式来构建层次结构(树形),跟Html一样,所以标签不仅用来标识内容,而且标签划分范围和级别,这样就能很好表示常见的数据结构,比如表结构数据或者是对象存储的数据:
3.Xml解析的方式
目前解析xml文件的方式都是通过顺序遍历xml中所有元素(或者更形象的成为节点),然后检查这个元素的事件类型,通过返回的事件类型可以判断当前元素的性质,并且不同类型的元素提供获取该元素或者相邻元素的名称或值。
那么需要遍历的元素(节点)有哪些呢?最明显的就是标签(tag)和文本(text),标签是用方括号<>或<\>括起来的内容,它返回的事件类型分别开始标签(start tag)和结束标签(end tag),文本是标签之间内容,需要注意是不仅仅是相同标签对之间的文本,不同标签之间也是文本,比如上面和之间也是节点,它也会被遍历,并且它事件类型是文本,它的内容就是换行符。
最后还有文档开始(start document)和文档结束(end document)两个节点,它是用来判断文档遍历从哪开始和结束。
4.Sax和Pull解析的原理
目前Android比较常用的解析方式就是Pull和Sax,他们解析的原理参照第二条,但是它们在程序设计上还是有所区别的。
- Sax
自动顺序解析节点并检查事件类型,根据返回的事件类型回调(contentHandler)接口中对应的方法,分别是
startDocument(),文档开始处
endDocument(),文档结束处
startElement(),开始标签
endElement(),结束标签
characters(),文本(包括空白和换行)
你可以通过继承抽象类DefaultHandler,并且复写其中的方法来创建自己的业务逻辑。
接着需要创建Sax解析器对象:
1.创建工厂对象:首先需要通过工厂类SaxParserFactory的静态方法newInstance()来返回Sax解析工厂对象,因为它的构造函数为保护类型,所以不能直接创建。
2.通过工厂对象创建Sax解析器对象:通过SaxParserFactory的newSaxParser()方法返回。
然后用Sax解析器解析xml数据:
3.通过Sax解析器的Parse()方法,它接受两个参数,第一个参数为xml数据,形式可以是inputStream、Reader或InputSource,第二个参数是contentHandler类型。 - Pull
首先需要创建Pull解析器对象,同SaxParser类似:
1.创建解析工厂对象:通过XmlPullParserFactory的newInstance()方法。
2.通过工厂对象创建Pull解析器对象:通过XmlPullParserFactory的newPullParser()来返回Pull解析器对象。
然后用Pull解析器对象解析xml数据:
3.通过解析器的setInput()方法,接收解析内容,可以是InputStream或Reader类型。
然后通过Pull解析器的getEventType()返回当前文档事件类型,用整型常用表示,分别有XmlPullParser.START_DOCUMENT、END_DOCUMENT、START_TAG、END_TAG、TEXT,接着用while循环和XmlPullParser.next()方法不断遍历所有节点,其中当事件类型为END_DOCUMENT循环结束,另外要说明的next()不仅会遍历下一个节点,而且会返回事件类型。
最后在while循环中,你可以根据事件类型和节点类型所具备的方法(比如为标签时,可以通过通过getName()获取标签名;getNextText()返回标签后面的文本)进行组合判断以获取自己想要的值,一般都是对应标签间的文本。
5.Json介绍。
json的用处与xml是一样的,只不过json存储同样的数据,附加信息更少,所以体积更小,但是它通过直观阅读更加困难一点,因为它不是树状结构。
Json的结构规则:
首先从最小的名称和数值对来说,它是通过冒号“:”来分隔的,比如”name”:”Jack”,不同名称/值之间用逗号“,”分隔,比如”name”:”Java”,”age”:”18”,一行数据或一个对象用花括号{}来括起来,不同行或者对象之间同样用逗号来分隔,所有的表或者对象数组用方括号“【”和“】”来括起来,比如上面xml中的数据用Json格式表示:
[{"name":"Jack","age":"28","sex":"Male"},{"name":"Mary","age":"19","sex":"Female"}...]
Json解析:
Json解析可以把多行数据解析为对象数组(JsonArray):
JsonArray jsonArray = new JsonArray(String xmlData);
并且数组中每一组数据都是一个Json对象(JsonObject),可以通过for循环依次遍历数组中每一个Json对象,然后通过JsonObject的getXXX(xxx表示基本数据类型)方法来返回名称所对应的值。
for(int i= 0; i < jsonArray.length; i++){
JsonObject jsonObject = jsonArray.get(i);
String name = jsonObject.getString(name);
....
}