結構化特征
DOM:Document Object Model 文檔對象模型 有W3C 推薦
一次讀取整個文檔,整顆DOM樹常駐內存,導致系統開銷過大
SAX :Simple API for XML 并不是其推薦的標準 但是整個XML 行業的事實規范
8.4.4 使用GDataXML解析XML文檔
GDataXML 開源 對libxml2的包裝 ?支持解析和修改 支持XPath
1.添加libxml2.dylib
2.添加/usr/include/libxml2 ? ?搜索路徑
BuildSettings-Header Search Paths
PS:不支持ARC 需要手動關閉 ? -fno-objc-arc
下載GDataXML源代碼
https://code.google.com/p/gdata-objectivec-client/source/browse/trunk/Source/XMLSupport/
http://down.51cto.com/data/619375
#import"GDataXMLNode.h"
#import"MyBook.h"
@interfaceViewController()
@property(weak,nonatomic)IBOutletUITextField*siteFild;
@end
@implementationViewController
//GDataXML解析
-(NSArray*)parseXML:(NSString*)xmlName
{
NSString* path=[[NSBundlemainBundle]pathForResource:xmlNameofType:@"xml"];
NSFileHandle* file=[NSFileHandlefileHandleForReadingAtPath:path];
NSData* data=[filereadDataToEndOfFile];
GDataXMLDocument* doc=[[GDataXMLDocumentalloc]initWithData:dataoptions:0error:nil];
//如果需要根據XML字符串來初始化GDataXMLDocument對象,則調用如下代碼
//? ? GDataXMLDocument* doc=[[GDataXMLDocument alloc]initWithXMLString:NSXMLStr options:0 error:nil];
//獲取根元素也就是獲取元素
GDataXMLElement* rootELement=[docrootElement];
NSArray* bookElements=[rootELementelementsForName:@"book"];
//初始化一個可變數組,用于存儲將要獲取的所有元素組成的集合
NSMutableArray* books=[[NSMutableArrayalloc]init];
for(GDataXMLElement* bookElementinbookElements) {
NSIntegerbookID=[[[bookElementattributeForName:@"id"]stringValue]integerValue] ;
NSString* title=[[[bookElementelementsForName:@"title"]objectAtIndex:0]stringValue];
NSString* author=[[[bookElementelementsForName:@"author"]
objectAtIndex:0]stringValue];
NSString* remark=[[[bookElementelementsForName:@"remark"]objectAtIndex:0]stringValue];
MyBook* book=[[MyBookalloc]init];
book.bookID=bookID;
book.author=author;
book.title=title;
book.remark=remark;
[booksaddObject:book];
}
return[bookscopy];
}
8.4.5 使用GDataXML生成 修改XML文檔
//
//? ViewController.m
//? 5-8-1-XML
//
//? Created by童康on 16/5/8.
//? Copyright ? 2016年童康. All rights reserved.
//
#import"ViewController.h"
#import"GDataXMLNode.h"
@interfaceViewController()
@property(weak,nonatomic)IBOutletUITextField*bookID;
@property(weak,nonatomic)IBOutletUITextField*bookName;
@property(weak,nonatomic)IBOutletUITextField*author;
@property(weak,nonatomic)IBOutletUITextField*remark;
@property(nonatomic,strong)NSString* xmlPath;
@end
@implementationViewController
- (void)viewDidLoad {
[superviewDidLoad];
[selfxmlPath];
// Do any additional setup after loading the view, typically from a nib.
}
- (IBAction)add:(id)sender {
NSString* bookID=self.bookID.text;
NSString* bookName=self.bookName.text;
NSString* author=self.author.text;
NSString* remark=self.remark.text;
if(bookID.length>0&& bookName.length>0&& author.length>0&&remark.length>0) {
//使用NSFileHandle對象根據文件路徑獲取到文件
NSFileHandle* file=[NSFileHandlefileHandleForReadingAtPath:self.xmlPath];
NSData* data=[filereadDataToEndOfFile];
GDataXMLDocument*doc;
//定義變量保存將要處理的XML文檔對象
GDataXMLElement* rootEle;
if(data) {
//根據NSData對象初始化
doc=[[GDataXMLDocumentalloc]initWithData:dataoptions:0error:nil];
rootEle=doc.rootElement;
}
//如果XML文檔還不存在,則需要新建文檔
else
{
//創建元素
rootEle=[GDataXMLNodeelementWithName:@"books"];
GDataXMLElement* bookEle=[GDataXMLNodeelementWithName:@"id"stringValue:bookID];
//創建id屬性,屬性值為bookID
GDataXMLNode* attr=[GDataXMLNodeattributeWithName:@"id"stringValue:bookID];
[rootEleaddAttribute:attr];
//依次創建3個子元素
GDataXMLElement* titleEle=[GDataXMLNodeelementWithName:@"title"stringValue:bookName];
GDataXMLElement* authorEle=[GDataXMLNodeelementWithName:@"author"stringValue:author];
GDataXMLElement* remarkEle=[GDataXMLNodeelementWithName:@"remark"stringValue:remark];
//將3個子元素添加到bookEle元素中
[bookEleaddChild:titleEle];
[bookEleaddChild:authorEle];
[bookEleaddChild:remarkEle];
//將book元素添加入XML文檔跟元素的子元素
[rootEleaddChild:bookEle];
//
if(!data) {
//以指定的根元素創建Document對象
doc=[[GDataXMLDocumentalloc]initWithRootElement:rootEle];
}
//將doc專為data
[doc.XMLDatawriteToFile:self.xmlPathatomically:YES];
self.bookID.text=nil;
self.bookName.text=nil;
self.author.text=nil;
self.remark.text=nil;
//創建并顯示提示框
UIAlertView* alert=[[UIAlertViewalloc]initWithTitle:@"提示"message:@"添加成功!"delegate:selfcancelButtonTitle:@"確定"otherButtonTitles:nil];
[alertshow];
}
}else{
UIAlertView* alert=[[UIAlertViewalloc]initWithTitle:@"提示"message:@"您必須為所有信息都輸入有效的值"delegate:selfcancelButtonTitle:@"確定"otherButtonTitles:nil];
[alertshow];
}
}
-(NSString*)xmlPath{
//獲取應用程序沙盒的Documents路徑
NSArray* paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString* documentsDirectory=[pathsobjectAtIndex:0];
NSLog(@"%@",documentsDirectory);
return[NSStringstringWithFormat:@"%@/books.xml",documentsDirectory];
}
- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end