iOS数据解析,XML(SAX,DOM - GDataXMLNode)

来源:互联网 发布:ubuntu哪个版本稳定 编辑:程序博客网 时间:2024/05/22 01:46

一、XML概述

解析:从事先规定好的格式中提取数据(就是翻译成能懂的语言)

解析的前提:提前约定好的格式、数据提供方按照格式提供数据、数据获取方按照格式获取数据

iOS常见的解析:XML解析、JSON解析  

XML:Extensible Markup Language是主流数据格式之一,可以用来存储和传输数据,可以用来标记数据、定义数据结构,是一种允许用户对自己的标记语言进行定义的源语言

XML数据格式的功能:1.数据交换 2.Web服务 3.内容管理 4.(主要功能)用作配置文件

二、XML的解析

XML的常用的解析方式主要有两种:1.SAX   2.DOM

1.SAX(Simple API for XML)是基于事件驱动的解析方式,逐行解析,采用协议回调机制

NSXMLParser是iOS自带的XML解析类,采用SAX方式解析数据,解析过程由NSXMLParserDelegate协议方法回调。NSXMLParser在处理XML文档的过程中当遇到一些要素(元素、属性等)时回通知它的代理对象,而不是自身不对解析的要素进行任何处理,全委托给NSXMLParserDelegate处理。

解析过程:开始标签->取值->结束标签->取值

示例:

<span style="font-family:monospace;font-size:13px;"><span style="font-family: Menlo;">   //</span>获取要解析的<span style="font-family: Menlo;">XML</span>文件的路径<br style=" padding: 2px 0px; font-size: 18px; font-family: Menlo; color: rgb(61, 29, 129);" />    <span style="color: rgb(112, 61, 170);">NSString</span> *XMLPath = [[<span style="color: rgb(112, 61, 170);">NSBundle</span> mainBundle] pathForResource:<span style="color: rgb(209, 47, 27);">@"StudentInfo"</span> ofType:<span style="color: rgb(209, 47, 27);">@"xml"</span>];<br style=" padding: 2px 0px; font-size: 18px; font-family: 'Heiti SC Light'; color: rgb(0, 132, 0);" /><span style="font-family: Menlo;">    </span><span style="font-family: Menlo;">//</span>根据路径获取<span style="font-family: Menlo;">XML</span>文件的内容,并转化成字符串形式<br style=" padding: 2px 0px; font-size: 18px; font-family: Menlo; color: rgb(61, 29, 129);" />    <span style="color: rgb(112, 61, 170);">NSString</span> *content = [<span style="color: rgb(112, 61, 170);">NSString</span> stringWithContentsOfFile:XMLPath encoding:NSUTF8StringEncoding error:<span style="color: rgb(187, 44, 162);">nil</span>];<br style=" padding: 2px 0px; font-size: 18px; font-family: 'Heiti SC Light'; color: rgb(0, 132, 0);" /><span style="font-family: Menlo;">    </span><span style="font-family: Menlo;">//</span>将字符串形式的数据再转化成<span style="font-family: Menlo;">NSData</span>(二进制字节流的形式,这样计算机才能识别)<br style=" padding: 2px 0px; font-size: 18px; font-family: Menlo; color: rgb(61, 29, 129);" />    <span style="color: rgb(112, 61, 170);">NSData</span> *XMLData = [content dataUsingEncoding:NSUTF8StringEncoding];</span>
<span style="font-family:monospace;font-size:13px;"><span style="font-family:monospace;font-size:13px;">//1.1 XML------SAX</span><span style="font-family: 'Heiti SC Light';font-size:14px;">解析</span><br style="font-family:'Helvetica Neue';font-size:14px;" /><span style="font-family:'Helvetica Neue';font-size:14px;">    </span><span style="color: rgb(112, 61, 170);font-family:'Helvetica Neue';font-size:14px;">NSXMLParser</span><span style="font-family:'Helvetica Neue';font-size:14px;"> *xmlParser = [[</span><span style="color: rgb(112, 61, 170);font-family:'Helvetica Neue';font-size:14px;">NSXMLParser</span><span style="font-family:'Helvetica Neue';font-size:14px;"> </span><span style="color: rgb(61, 29, 129);font-family:'Helvetica Neue';font-size:14px;">alloc</span><span style="font-family:'Helvetica Neue';font-size:14px;">] </span><span style="color: rgb(61, 29, 129);font-family:'Helvetica Neue';font-size:14px;">initWithData</span><span style="font-family:'Helvetica Neue';font-size:14px;">:XMLData];</span><br style="font-family:'Helvetica Neue';font-size:14px;" /><span style="font-family:'Helvetica Neue';font-size:14px;">    xmlParser.</span><span style="color: rgb(112, 61, 170);font-family:'Helvetica Neue';font-size:14px;">delegate</span><span style="font-family:'Helvetica Neue';font-size:14px;"> = </span><span style="color: rgb(187, 44, 162);font-family:'Helvetica Neue';font-size:14px;">self</span><span style="font-family:'Helvetica Neue';font-size:14px;">;</span><br style="font-family:'Helvetica Neue';font-size:14px;" /><span style="font-family: Menlo; font-size: 14px;">    </span><span style="font-family: Menlo;font-size:14px;">//</span><span style="font-family:'Helvetica Neue';font-size:14px;">给解析器对象发送</span><span style="font-family: Menlo;font-size:14px;">parse</span><span style="font-family:'Helvetica Neue';font-size:14px;">(解析)消息</span><br style="font-family:'Helvetica Neue';font-size:14px;" /><span style="font-family:'Helvetica Neue';font-size:14px;">    [xmlParser </span><span style="color: rgb(61, 29, 129);font-family:'Helvetica Neue';font-size:14px;">parse</span><span style="font-family:'Helvetica Neue';font-size:14px;">];</span><br style="font-family:'Helvetica Neue';font-size:14px;" /><span style="font-family:'Helvetica Neue';font-size:14px;">    [xmlParser </span><span style="color: rgb(61, 29, 129);font-family:'Helvetica Neue';font-size:14px;">release</span><span style="font-family:'Helvetica Neue';font-size:14px;">];</span><br style="font-family:monospace;font-size:13px;" /></span>
2.DOM(Document Object Model文档对象模型)解析 - 解析时需要讲XML文件整体读入,并且将XML结构化成树状,使用时在通过树状结构读取相关数据

GDataXMLNode是Google提供的开源XML解析类,对libxml2.dylib进行了Objective-C封装

采用DOM方式解析数据

iOS包含一个C语言的动态链接库libxml2.dylib,解析速度比NSXMLParser快

使用时在gitHub等网站下载GDataXMLNode.h 和 GDataXMLNode.m并倒入工程中,然后在头文件中引入GDataXMLNode.h

示例

<span style="font-family:monospace;font-size:13px;">//1.<span style="font-family: 'Heiti SC Light';">生成</span>xml<span style="font-family: 'Heiti SC Light';">文件对象</span><br style=" padding: 2px 0px; font-size: 18px; font-family: Menlo;" />    <span style="color: rgb(79, 129, 135);">GDataXMLDocument</span> *xmlDocument = [[<span style="color: rgb(79, 129, 135);">GDataXMLDocument</span>  <span style="color: rgb(61, 29, 129);">alloc</span>] <span style="color: rgb(49, 89, 93);">initWithData</span>:XMLData <span style="color: rgb(49, 89, 93);">options</span>:<span style="color: rgb(39, 42, 216);">0</span> <span style="color: rgb(49, 89, 93);">error</span>:<span style="color: rgb(187, 44, 162);">nil</span>];<br style=" padding: 2px 0px; font-size: 18px; font-family: Menlo; color: rgb(0, 132, 0);" />    //2.<span style="font-family: 'Heiti SC Light';">获取根节点对象</span><br style=" padding: 2px 0px; font-size: 18px; font-family: Menlo;" />    <span style="color: rgb(79, 129, 135);">GDataXMLElement</span> *rootElement = [xmlDocument <span style="color: rgb(49, 89, 93);">rootElement</span>];<br style=" padding: 2px 0px; font-size: 18px; font-family: Menlo; color: rgb(0, 132, 0);" />    //3.<span style="font-family: 'Heiti SC Light';">获取子节点对象们</span><br style=" padding: 2px 0px; font-size: 18px; font-family: Menlo;" />    <span style="color: rgb(112, 61, 170);">NSArray</span> *subElements = [rootElement <span style="color: rgb(49, 89, 93);">elementsForName</span>:<span style="color: rgb(209, 47, 27);">@"student"</span>];<br style=" padding: 2px 0px; font-size: 18px; font-family: Menlo; color: rgb(0, 132, 0);" />    //4.<span style="font-family: 'Heiti SC Light';">根据</span>forin<span style="font-family: 'Heiti SC Light';">获取每个</span>student<span style="font-family: 'Heiti SC Light';">对象</span><br style=" padding: 2px 0px; font-size: 18px; font-family: Menlo;" />    <span style="color: rgb(187, 44, 162);">for</span> (<span style="color: rgb(79, 129, 135);">GDataXMLElement</span> *oneElement <span style="color: rgb(187, 44, 162);">in</span> subElements) {<br style=" padding: 2px 0px; font-size: 18px; font-family: Menlo;" />        <span style="color: rgb(112, 61, 170);">NSString</span> *name = [[[oneElement <span style="color: rgb(49, 89, 93);">elementsForName</span>:<span style="color: rgb(209, 47, 27);">@"name"</span>] <span style="color: rgb(61, 29, 129);">firstObject</span>] <span style="color: rgb(61, 29, 129);">stringValue</span>];<br style=" padding: 2px 0px; font-size: 18px; font-family: Menlo;" />        <span style="color: rgb(112, 61, 170);">NSUInteger</span> age = [[[[oneElement <span style="color: rgb(49, 89, 93);">elementsForName</span>:<span style="color: rgb(209, 47, 27);">@"age"</span>] <span style="color: rgb(61, 29, 129);">firstObject</span>] <span style="color: rgb(61, 29, 129);">stringValue</span>] <span style="color: rgb(61, 29, 129);">integerValue</span>];<br style=" padding: 2px 0px; font-size: 18px; font-family: Menlo;" />        <span style="color: rgb(112, 61, 170);">NSString</span> *sex = [[[oneElement <span style="color: rgb(49, 89, 93);">elementsForName</span>:<span style="color: rgb(209, 47, 27);">@"sex"</span>] <span style="color: rgb(61, 29, 129);">firstObject</span>] <span style="color: rgb(61, 29, 129);">stringValue</span>];<br style=" padding: 2px 0px; font-size: 18px; font-family: Menlo;" />        <span style="color: rgb(61, 29, 129);">NSLog</span>(<span style="color: rgb(209, 47, 27);">@"name:%@, age:%lu, sex:%@"</span>, name, age, sex);<br style=" padding: 2px 0px; font-size: 18px; font-family: Menlo;" />    }<br style=" padding: 2px 0px; font-size: 18px; font-family: Menlo;" />    [xmlDocument <span style="color: rgb(61, 29, 129);">release</span>];</span>






0 0