XML应用
- 一. 基本概念
- 1. 解析:从XML文档中分析出结构,编程可在程序中使用的形式的额操作被成为解析。进行解析处理的程序被称作解析器。
- 2. XML解析器的种类
- 1) DOM
XML的层次关系即为树结构,DOM解析器能直接操作树结构;
- 2) SAX
遵循从XML头部开始解析的思想,在读入内容的同时报告结果,又称为时间驱动的间隙器;
- 二. Cocoa中的解析器
- 1. 分类
- 1) DOM解析器支持:
- 2) SAX解析器:继承关系:
NSObjectNSXMLParser
- 2. DOM解析器的详细说明
- 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,即没有指定任何选项;
- 2) XPath
XML文档解析后,下一步就是去的目的节点了;两种方式:一是跟家父子关系进行遍历。首先取得父节点,然后是其子节点,如此反复;二,找到从根节点到目的节点的路径,然后根据此路径获得节点信息;“/rss/channel/item//title”这样的路径程序XPath
//
NSArray *nodes;
NSError *error;
Node =[document nodesForXpath:@”/rss/channel/item/title” error:error];
- 3) 节点信息
常用方法名:
例子:<title>Cocoa</titile>
kind NSXMLElementKind
name title
stringValue Cocoa
XMLString <title>Cocoa</titile>
- 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];
}
}
- 5) 属性值的取得:
- - (NSXMLNode *)attributeForName:(NSString *)name
通过名称取得属性节点
- - (NSArray *)attributes
取得属性节点的数组;