iOS GData處理XML(一)簡單結構示例

iOS開發中使用GData處理簡單結構的XML非常簡單,只需要明白GData提供的幾個方法意思就可以。這裏做一下簡單的示例:

首先讀取原xml數據到系統中


// 原xml結構示例
// <m>
//   <c>2000101</c>
//   <n_1>一般職業</n_1>
//   <n_2>機關</n_2>
//   <n_3>機關團體內勤人員</n_3>
//   <sx>1</sx>
//   <yw>1</yw>
//   <yl>1</yl>
//   <hm>1</hm>
// </m>

// 獲取工程目錄的xml文件
 NSData * xmlData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"010" ofType:@"xml"]];
 
 // 從文檔中讀出完整的XML數據,在內存中形成完整的樹形結構
 NSError * error = nil;
 GDataXMLDocument * documents = [[GDataXMLDocument alloc]initWithData:xmlData options:0 error:&error];
 
 // 取得根節點(element元素)
 GDataXMLElement * rootEL = [documents rootElement];

 // 獲取根節點下的節點,返回的數組
 NSArray * studentsArray = [rootEL elementsForName:@"m"];
 for (int i = 0; i < [studentsArray count]; i++) {
 
 // 獲取單個節點對象
 GDataXMLElement * student = [studentsArray objectAtIndex:i];
 
 // 獲取m節點下節點的值
 GDataXMLElement * code = [[student elementsForName:@"c"] lastObject];
 GDataXMLElement * n_1 = [[student elementsForName:@"n_1"]lastObject];
 GDataXMLElement * n_2 = [[student elementsForName:@"n_2"]lastObject];
 GDataXMLElement * n_3 = [[student elementsForName:@"n_3"]lastObject];
 GDataXMLElement * sx = [[student elementsForName:@"sx"] lastObject];
 GDataXMLElement * yw = [[student elementsForName:@"yw"]lastObject];
 GDataXMLElement * yl = [[student elementsForName:@"yl"]lastObject];
 GDataXMLElement * hm = [[student elementsForName:@"hm"]lastObject];
 NSString * strcode = [code stringValue];
 NSString * strn_1 = [n_1 stringValue];
 NSString * strn_2 = [n_2 stringValue];
 NSString * strn_3 = [n_3 stringValue];
 NSString * strsx = [sx stringValue];
 NSString * stryw = [yw stringValue];
 NSString * stryl = [yl stringValue];
 NSString * strhm = [hm stringValue];
 
 ZSXMLModel *model = [[ZSXMLModel alloc]init];
 model.code = strcode;
 model.n_1 = strn_1;
 model.n_2 = strn_2;
 model.n_3 = strn_3;
 model.sx = strsx;
 model.yw = stryw;
 model.yl = stryl;
 model.hm = strhm;
  
 [_mArr addObject:model];
 
 // 讀標籤裏面的屬性(attributeForName)
 NSString * sign = [[student attributeForName:@"sign"]stringValue];
 if (sign) {
   NSLog(@"----------%@",sign);
 }

下面處理讀取的xml數據

// 目標結構
// <?xml version="1.0" encoding="utf-8"?>
// <root>
//   <c1 id="2000000" name="一般職業">
//     <c2 id="2000100" name="機關">
//       <c3 id="2000101" name="機關團體外勤人員(從事聯繫工作)" sx="1" yw="1" yl="1" hm="1" ></c3>
//       <c3 id="2000102" name="機關團體外勤人員(從事聯繫工作)1" sx="1" yw="1" yl="1" hm="1" ></c3>
//       <c3 id="2000103" name="機關團體外勤人員(從事聯繫工作)2" sx="1" yw="1" yl="1" hm="1" ></c3>
//     </c2>
//     <c2 id="2000200" name="工廠">
//       <c3 id="2000201" name="機關團體內勤人員" sx="1" yw="1" yl="1" hm="1" ></c3>
//       <c3 id="2000202" name="機關團體內勤人員" sx="1" yw="1" yl="1" hm="1" ></c3>
//       <c3 id="2000203" name="機關團體內勤人員" sx="1" yw="1" yl="1" hm="1" ></c3>
//     </c2>
//   </c1>
// </root>
//生成根節點
 GDataXMLElement *root = [GDataXMLElement elementWithName:@"root"];
 GDataXMLElement *c2 = [GDataXMLElement elementWithName:@"c2"];
 GDataXMLElement *c1 = [GDataXMLElement elementWithName:@"c1"];
 for (int i = 0; i < _mArr.count; i++) {
 ZSXMLModel *model = _mArr[i];
 ZSXMLModel *modeln = _mArr[i == _mArr.count - 1 ? i : i+1];

 //c1
 NSString *strC1c = [NSString stringWithFormat:@"%@0000",[model.code substringWithRange:NSMakeRange(0, 3)]];
 GDataXMLElement *c1id = [GDataXMLElement attributeWithName:@"id" stringValue:strC1c];
 GDataXMLElement *c1n = [GDataXMLElement attributeWithName:@"name" stringValue:model.n_1];
 [c1 addAttribute:c1id];
 [c1 addAttribute:c1n];
 //c2
 NSString *strC2c = [NSString stringWithFormat:@"%@00",[model.code substringWithRange:NSMakeRange(0, 5)]];
 GDataXMLElement *c2id = [GDataXMLElement attributeWithName:@"id" stringValue:strC2c];
 GDataXMLElement *c2n = [GDataXMLElement attributeWithName:@"name" stringValue:model.n_2];
 [c2 addAttribute:c2id];
 [c2 addAttribute:c2n];
 //c3
 GDataXMLElement *c3 = [GDataXMLElement elementWithName:@"c3"];
 GDataXMLElement *c3id = [GDataXMLElement attributeWithName:@"id" stringValue:model.code];
 GDataXMLElement *c3n = [GDataXMLElement attributeWithName:@"name" stringValue:model.n_3];
 GDataXMLElement *sx = [GDataXMLElement attributeWithName:@"sx" stringValue:model.sx];
 GDataXMLElement *yw = [GDataXMLElement attributeWithName:@"yw" stringValue:model.yw];
 GDataXMLElement *yl = [GDataXMLElement attributeWithName:@"yl" stringValue:model.yl];
 GDataXMLElement *hm = [GDataXMLElement attributeWithName:@"hm" stringValue:model.hm];
 [c3 addAttribute:c3id];
 [c3 addAttribute:c3n];
 [c3 addAttribute:sx];
 [c3 addAttribute:yw];
 [c3 addAttribute:yl];
 [c3 addAttribute:hm];
 [c2 addChild:c3];
 
 if (![model.n_2 isEqualToString:modeln.n_2] || i == _mArr.count-1) {
   [c1 addChild:c2];
 if (i != _mArr.count-1)
   c2 = [GDataXMLElement elementWithName:@"c2"];
 }
 if (![model.n_1 isEqualToString:modeln.n_1] || i == _mArr.count-1) {
   [root addChild:c1];
 if (i != _mArr.count-1)
   c1 = [GDataXMLElement elementWithName:@"c1"];
 }

 }
 GDataXMLDocument *xmlDoc = [[GDataXMLDocument alloc] initWithRootElement:root];
 //【關鍵】防止亂碼
 [xmlDoc setCharacterEncoding:@"utf-8"];
 NSData *data1 = [xmlDoc XMLData];
 NSString *xmlString = [[NSString alloc] initWithData:data1 encoding:NSUTF8StringEncoding];
 NSLog(@"%@", xmlString);

注意:
將子節點添加到父節點後子節點就不能再進行編輯,所以需要將子節點的所有數據都加入到該節點後,再把子節點添加到父節點中。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章