天天看点

ios--XML应用

XML应用

  1. 一. 基本概念
  1. 1. 解析:从XML文档中分析出结构,编程可在程序中使用的形式的额操作被成为解析。进行解析处理的程序被称作解析器。
  2. 2. XML解析器的种类
  1. 1) DOM

XML的层次关系即为树结构,DOM解析器能直接操作树结构;

  1. 2) SAX

遵循从XML头部开始解析的思想,在读入内容的同时报告结果,又称为时间驱动的间隙器;

  1. 二. Cocoa中的解析器
  1. 1. 分类
  1. 1) DOM解析器支持:
ios--XML应用
  1. 2) SAX解析器:继承关系:

NSObjectNSXMLParser

  1. 2. DOM解析器的详细说明
  1. 1) XML文档的解析器NSXMLDocument

解析之前先进行初始化,初始化一般有三种方法,URL(NSURL)、数据(NSData),字符串(NSString)等形式;

  • - (id)initWithContentsOfURL:(NSURL *)url options:(NSUInteger)mask error:(NSError **)error
  • - (id)initWithXMLString:(NSString *)string options:(NSUInteger)mask error:(NSError **)error
  • - (id)initWithData:(NSData *)data options:(NSUInteger)mask error:(NSError **)error

① 使用URL时,可以指定网上的XML文档,如果是本地的文档,在URL中指定域,即以:“域://路径”形式写

②NSData;可以使用读入文件后的NSData数据(利用NSData的dataWithContentsOfFile方法)

③ mask的常用常量列表:NSXMLDocumentTidyHTML,以XML的方式进行解析;

NSXMLDocumentTidyXML 将不正确的XML转化为正确的XML进行解析;

NSXMLDocumentValidate 使用DTD或XML Schema进行验证

NSXMLDocumentInclude 读入在XInclude中指定的文档;

  NSXMLDocument *document;

    NSError *error;

    document = [[NSXMLDocument alloc] initWithContentsOfURL:url options:0 error:error];

    if(!document){

        NSLog(@"error %@",[error localizedDescription]);

    }

mask选项指定为0,即没有指定任何选项;

  1. 2) XPath

XML文档解析后,下一步就是去的目的节点了;两种方式:一是跟家父子关系进行遍历。首先取得父节点,然后是其子节点,如此反复;二,找到从根节点到目的节点的路径,然后根据此路径获得节点信息;“/rss/channel/item//title”这样的路径程序XPath

  • - (NSArray *)nodesForXPath:(NSString *)xpath error:(NSError **)error

//

NSArray *nodes;

NSError *error;

Node =[document nodesForXpath:@”/rss/channel/item/title” error:error];

  1. 3) 节点信息

常用方法名:

例子:<title>Cocoa</titile>

kind NSXMLElementKind

name title

stringValue Cocoa

XMLString <title>Cocoa</titile>

  1. 4) 节点的父子关系

常用的方法:

Parent 取得父节点
childCount 取得子节点的个数
Children 以数组的形式取得子节点
childAtIndex: (unsigned)index 取得由索引index指定的节点
previousSibling 取得上一个兄弟节点
nextSibling 取得下一个兄弟节点

取得节点所属NSXMLDocument的方法:

RootDocument 取得当前节点的NSXMLDocument实例
rootElement 取得当前文档的根节点

例子:

-[(void)displayNodeName:(NSXMLNode *)node] {

        NSLog(@"name is %@",[node name]);

        //取得子节点

        NSEnumerator *enumerator;

        NSXMLNode *childNode;

        enumerator = [[node children] objectEnumerator];//注意遍历的方法

        while (childNode = [enumerator nextObject]) {

            [self displayNodeName:childNode];

        }

    }

  1. 5) 属性值的取得:
  • - (NSXMLNode *)attributeForName:(NSString *)name

通过名称取得属性节点

  • - (NSArray *)attributes

取得属性节点的数组;