更新時間:2021-08-19 11:29:05 來源:動力節點 瀏覽891次
XML(eXtensible Markup Language),是一種對字符串文件內容進行結構化標記的語言。
以根元素為基礎的樹狀數據結構。
用于數據傳輸,而非顯示。
自定義標簽。
自我描述。
同HTML非常相似。
<!-- 我是注釋:XML示例 -->
<root> // 根元素
<subchild1 屬性1="屬性值1" 屬性2="屬性值2" 屬性3="屬性值3"> // 元素可以擁有若干屬性,以空格區分;放在開始標簽中
<subchild2 屬性1="屬性值1"/> // 如果只保留結束標簽,就將屬性放在結束標簽中
<subchild3>文本內容</subchild3> // 元素的文本內容放在首尾標簽之間
......
</subchild1>
</root>
構成
聲明,記錄了XML版本和編碼方式。
元素,即開始標簽和結束標簽之間的部分,是XML數據的基本單位。其可以包含:
其他元素,元素之間不能交叉嵌套。
文本,所有的空格和換行都會被作為文本內容處理。
屬性,提供關于元素的額外信息,屬性值必須加引號(單引號/雙引號)。
根元素:一個節點中只能有一個,它是所有子元素的父元素。
語法
有且只有一個根元素
屬性值必須加引號
必須正確嵌套
標簽對大小寫敏感
元素必須有一個關閉標簽
數據保存:屬性?元素?
屬性不能包含多個值,元素可以。
屬性不能包含樹結構,元素可以。
屬性不容易擴展(為未來的變化)。
SAX:從根元素開始,按照數據結構順序解析(從下至上,從外向內),適合大文件。
DOM:一次性將整個XML加載進內存進行解析,適合比較小的文件。
NSXMLParser / SAX解析
屬性數據:
/**
開始解析一個XML文件時調用
*/
- (void)parserDidStartDocument:(NSXMLParser *)parser;
/**
開始解析某個元素時調用
*/
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
{
NSLog(@"開始解析元素:%@--->屬性字典:%@", elementName, attributeDict);
/*
如果用屬性保存數據,則可以在這個代理方法中利用屬性字典/attributeDict,獲取所需的數據
*/
if ([elementName isEqualToString:@"vedio"]) {
RAPVideoModel *model = [RAPVideoModel videoModelWithDictonary:attributeDict];
[self.dataArray addObject:model];
}
}
/**
某個元素含有文本內容時調用
*/
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;
/**
解析某個元素完畢時調用
*/
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName;
/**
解析一個XML文件結束時調用
*/
- (void)parserDidEndDocument:(NSXMLParser *)parser;
元素數據
/**
開始解析某個元素時調用
*/
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
{
/*
找到目標元素,在開始解析時,創建模型,做好數據接收的準備。
*/
if ([elementName isEqualToString:@"vedio"]) {
self.videoModel = [RAPVideoModel new];
}
}
/**
某個元素含有文本內容時調用
*/
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
NSLog(@"發現元素文本內容:%@", string);
/*
記錄元素的文本內容。
elementValueString是一個可辨字符串
*/
[self.elementValueString setString:string];
}
/**
解析某個元素完畢時調用
*/
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
/*
通過判斷元素名,來確定元素是否攜帶了所需的數據(內容),將其內容加入到模型。
videoModel代表目標元素所對應的模型對象
*/
if ([elementName isEqualToString:@"ID"]) {
[self.videoModel setValue:self.elementValueString forKey:elementName];
}
if ([elementName isEqualToString:@"length"]) {
[self.videoModel setValue:self.elementValueString forKey:elementName];
}
if ([elementName isEqualToString:@"name"]) {
[self.videoModel setValue:self.elementValueString forKey:elementName];
}
if ([elementName isEqualToString:@"url"]) {
[self.videoModel setValue:self.elementValueString forKey:elementName];
}
if ([elementName isEqualToString:@"image"]) {
[self.videoModel setValue:self.elementValueString forKey:elementName];
}
if ([elementName isEqualToString:@"vedio"]) {
[self.dataArray addObject:self.videoModel];
}
}
GDataXML/DOM解析
GDataXMLDocument,代表一個XML文件。
GDataXMLElement,代表一個XML元素。
GDataXMLNode,根據 DOM,XML 文檔中的每個成分都是一個節點。
屬性數據
NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:[NSURL URLWithString:@"http://localhost/resources/vedios.xml"]completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
/*
通過元素屬性保存數據時
*/
// 加載XML文件
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:NULL];
// 找出XML文件的根元素
GDataXMLElement *rootElement = doc.rootElement;
// 遍歷根元素,以獲取其子元素
[rootElement.children enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
GDataXMLElement *subElement = obj;
RAPVideoModel *model = [RAPVideoModel new];
// 遍歷一個子元素的屬性數組
[subElement.attributes enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
GDataXMLNode *attr = obj;
// sringValue為屬性值,name為屬性名
[model setValue:attr.stringValue forKey:attr.name];
}];
[self.dataArray addObject:model];
}];
}] resume];
元素數據
NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:[NSURL URLWithString:@"http://localhost/resources/vedios2.xml"]completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
/*
通過XML元素保存數據時
*/
// 加載XML文件
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:NULL];
// 找出XML文件的根元素
GDataXMLElement *rootElement = doc.rootElement;
// 遍歷根元素,以獲取其子元素
[rootElement.children enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
GDataXMLElement *subElement = obj;
RAPVideoModel *model = [RAPVideoModel new];
// 遍歷子元素的子元素數組
[subElement.children enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
GDataXMLElement *subSubElement = obj;
// sringValue為元素文本內容,name為元素名
[model setValue:subSubElement.stringValue forKey:subSubElement.name];
}];
[self.dataArray addObject:model];
}];
}] resume];
以上就是動力節點小編介紹的"XML數據",希望對大家有幫助,想了解更多可查看Java在線學習。動力節點在線學習教程,針對沒有任何Java基礎的讀者學習,讓你從入門到精通,主要介紹了一些Java基礎的核心知識,讓同學們更好更方便的學習和了解Java編程,感興趣的同學可以關注一下。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習