XML的设计主要是用来描述⼀些信息,并且进⾏行信息的传送,与HTML不同,HTML主要用来显示信息,而XML主要用来传递信息。
XML(eXtensible Markup Language) 可扩展标记语言,计算机之间使用这些标记理解并处理各种信息,XML⽂档可以由 XML的声明开始,XML的声明描述了当前文档是一个XML文 档。
xml和json对比:
json(相对于xml的数据,轻巧,传输速率高,冗余的数据少。缺点:可读性差)
xml(冗余的数据多,优点:可读性强,扩展性强)
一【声明】
XML声明是在文档开头,根节点之前的,可以省略。声明中包含了整个文档的信息,比如说版本,字符编码等信息。
<?xml version=”1.0” encoding=”UTF-8” ?>
这是一个XML声明,由<?xml开始到?>结束,包含了xml的版本以及编码等信息。
二【节点】(元素节点)
XML⽂档主要由节点构成。节点指的是从开始标签到结束标签,最外层叫根节点
<title>Harry Potter</title>
这是一个XML节点,节点的标题是title,节点的内容是Harry Potter。
三【属性】
属性是使用键值形式来描述与节点相关的一些信息。属性⼀般出现在开始标记中,不能出现在结束标记中,属性值必须加引号。一个节点不能包含多个同名属性。
<title id=”27”>Harry Potter</title>
对这个节点添加一个属性,属性名称为id,属性值为27(属性也是节点的一种,属性节点指的就是 id=”27”)
四【基本值】
又叫原子值,指的是节点的内容
1,<title>Harry Potter</title>中Harry Potter就叫基本值
2,属性值也是基本值
五【节点关系】
每个xml只有一个根节点(最外层的节点)
父:上一级节点
子:下一级节点
兄弟:同级节点
先辈:父、父的父,父的父的父。。。
后代:子、子的子、子的子的子。。。
六【操作】
//进行xml数据解析的第三方库(工作中也非常实用)
#import "GDataXMLNode.h"
(需要导入一个系统框架,添加一个文件路径)
libxml2包.....Header Search Paths中添加 /usr/include/libxml2路径
1,普通解析方法
NSString *path = [[NSBundle mainBundle] pathForResource:@"xml" ofType:@"txt"];
NSData *xmlData = [NSData dataWithContentsOfFile:path];
//创建xml解析作用的容器,使用xml格式的data
GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData:xmlData options:0 error:nil];
//取到xml数据的根节点(所有的节点都是GDataXMLElement对象)
GDataXMLElement *root = [document rootElement];
//取到root节点下名为books的子节点
NSArray *booksArray =[root elementsForName:@"books"];
//取到数组中的books节点
GDataXMLElement *books = [booksArray lastObject];
//取books下面的book节点
NSArray *bookArray = [books elementsForName:@"book"];
for (GDataXMLElement *book in bookArray) {
//拿到节点的属性,属性也是节点的一种
NSArray *attr= book.attributes;
//取到id属性的对象(第0个)
GDataXMLElement *idAttr = [attr objectAtIndex:0];
//打印属性的值
NSLog(@"idValue:%@",idAttr.stringValue);
NSArray *names =[book elementsForName:@"name"];
//取到book下的name节点
GDataXMLElement *name = [names objectAtIndex:0];
//取到name节点的内容(<name>书名</name>)
NSLog(@"name:%@",name.stringValue);
//取到当前节点的名称(标题)
NSLog(@"title:%@",name.name);
//取到整个节点
NSLog(@"xmlstring:%@",name.XMLString);
}
2,xpath
//xpath语句是一种对xml文档进行查找的语言,表述的是查找节点的位置
NSString *snsPath = [[NSBundle mainBundle] pathForResource:@"sns" ofType:@"txt"];
NSString *snsString = [NSString stringWithContentsOfFile:snsPath encoding:NSUTF8StringEncoding error:nil];
//进行xml解析的一个容器,把要解析的xml字符串放到容器中,通过容器进行后续的操作
GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithXMLString:snsString options:0 error:nil];
//user在xml文档中的路径
NSString *userPath = @"/root/user_list/user";
//根据xpath语句提供的节点的路径,取到相应的节点,放到数组中
NSArray *users =[doc nodesForXPath:userPath error:nil];
//(所有的节点(根节点或子节点)都是GDataXMLElement类的对象)
for (GDataXMLElement *user in users) {
//users中所有节点标题为username的子节点
NSArray *userNames = [user elementsForName:@"username"];
GDataXMLElement *userName = [userNames objectAtIndex:0];
//节点基本值
NSLog(@"userName:%@",userName.stringValue);
}
//双斜杠+节点名称,xpth语句,相对路径
//拿到一个节点中所有名为totalcount的后代节点
NSArray *totals = [doc nodesForXPath:@"//totalcount" error:nil];
GDataXMLElement *totalCount = [totals objectAtIndex:0];
NSLog(@"countValue:%@",totalCount.stringValue);