zoukankan      html  css  js  c++  java
  • IOS 中的XML解析

    IOS 中的XML解析

     

    首先说一下,在IOS中XML解析和在Android中的SAX或者Pull解析差别不大,都是基于事件的解析方式。

     

    首先,定义一个对象来表示XML的文档结构

    XMLElement.h

     

    #import <Foundation/Foundation.h>

     

    @interface XMLElement : NSObject

    // 标签名称

    @property (nonatomic,strong) NSString *name;

    // 标签的文本(注意在上一级标签和下一级标签之间室友文本的)

    @property (nonatomic,strong) NSString *text;

    // 标签的属性

    @property (nonatomic,strong) NSDictionary *attributes;

    // 子标签集合

    @property (nonatomic,strong) NSMutableArray *subElements;

    // 上一级标签

    @property (nonatomic,strong) XMLElement *parent;

     

    @end

     

    XMLElement.m

     

    #import "XMLElement.h"

     

    @implementation XMLElement

     

    @synthesize name,text,attributes,subElements,parent;

     

    -(NSMutableArray *) subElements

    {

    if(subElements == nil){

    subElements = [[NSMutableArray alloc]init];

    }

    return subElements;

    }

     

    @end

     

    XML文件的内容放在/Supporting File/的Group下面。名称为person.xml

     

    <?xml version="1.0" encoding="UTF-8"?>

    <root>

    <person id="1">

    <firstName>zhang</firstName>

    <lastName>sansan</lastName>

    <age>21</age>

    </person>

    <person id="2">

    <firstName>li</firstName>

    <lastName>sisisi</lastName>

    <age>31</age>

    </person>

    </root>

     

    解析的ViewController.h

     

    #import <UIKit/UIKit.h>

    #import "XMLElement.h"

     

    @interface ViewController : UIViewController <NSXMLParserDelegate>

    // 解析器对象

    @property (nonatomic,strong) NSXMLParser *parser;

    // 根元素

    @property (nonatomic,strong) XMLElement *rootElement;

    // 当前的元素

    @property (nonatomic,strong) XMLElement *currentElementPointer;

     

    @end

     

    解析的ViewController.m

     

    #import "ViewController.h"

    #import "UIColor+ColorWithARGB.h"

     

    @interface ViewController ()

     

    @end

     

    @implementation ViewController

     

    -(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    {

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if(self != nil){

    self.title = @"XML解析";

    }

    return self;

    }

     

    - (void)viewDidLoad

    {

    [super viewDidLoad];

     

    self.view.backgroundColor = [UIColor r:0xA5 g:0xA5 b:0x52];

     

     

    NSString *xmlFilePath = [[NSBundle mainBundle]pathForResource:@"person" ofType:@"xml"];

    NSData *data = [[NSData alloc]initWithContentsOfFile:xmlFilePath];

     

    self.parser = [[NSXMLParser alloc]initWithData:data];

    self.parser.delegate = self;

     

    if([self.parser parse]){

    NSLog(@"The XML is Parsed");

    NSMutableString *str = [[NSMutableString alloc]init];

    [str appendFormat:@"%@\n",self.rootElement.name];

    NSMutableArray *subs = self.rootElement.subElements;

    for(int i = 0;i < [subs count];i++){

    XMLElement *personElement = [subs objectAtIndex:i];

    [str appendFormat:@"\tname:%@",personElement.name];

    [str appendFormat:@",text:%@\n",personElement.text];

    NSArray *subPersonElements = personElement.subElements;

    for(int j = 0;j < [subPersonElements count];j++){

    XMLElement *subElement = [subPersonElements objectAtIndex:j];

    [str appendFormat:@"\t\tname:%@",subElement.name];

    [str appendFormat:@",text:%@\n",subElement.text];

    }

    }

     

    NSLog(@"======解析结果:%@" ,str);

     

    }else{

    NSLog(@"Failed to parse the XML");

    }

    }

     

    - (void)didReceiveMemoryWarning

    {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

    }

     

     

    // 文档开始

    -(void)parserDidStartDocument:(NSXMLParser *)parser

    {

    self.rootElement = nil;

    self.currentElementPointer = nil;

    }

    // 文档结束

    -(void)parserDidEndDocument:(NSXMLParser *)parser

    {

    self.currentElementPointer = nil;

    }

    // 元素开始

    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict

    {

    if(self.rootElement == nil){

    self.rootElement = [[XMLElement alloc]init];

    self.currentElementPointer = self.rootElement;

    }else{

    XMLElement *newElement = [[XMLElement alloc]init];

    newElement.parent = self.currentElementPointer;

    [self.currentElementPointer.subElements addObject:newElement];

    self.currentElementPointer = newElement;

    }

    self.currentElementPointer.name = elementName;

    self.currentElementPointer.attributes = attributeDict;

    NSLog(@"name:%@" , elementName);

    }

    // 元素结束

    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

    {

    self.currentElementPointer = self.currentElementPointer.parent;

    NSLog(@"end name:%@" , elementName);

    }

    // 解析文本,会多次解析,每次只解析1000个字符,如果多月1000个就会多次进入这个方法

    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

    {

    if([self.currentElementPointer.text length] > 0){

    self.currentElementPointer.text = [self.currentElementPointer.text stringByAppendingString:string];

    }else{

    self.currentElementPointer.text = [NSMutableString stringWithString:string];

    }

     

    NSLog(@"string:%@" , string);

    }

    @end

     

     

  • 相关阅读:
    oracle中rownum和rowid的区别和用法
    jsp中,对window对象的简单总结
    下拉列表框实现二级联动
    window.showModalDialog()的简单用法
    javascript中的正则表达式
    java实现树型结构样式
    几个数据库的驱动、连接
    Java桌面程序中设置一个软件的系统托盘
    【动态规划】求两字符串连续最大公共子串长度
    大整数相乘
  • 原文地址:https://www.cnblogs.com/xinye/p/3138450.html
Copyright © 2011-2022 走看看