加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

nsxmlparser 详解

发布时间:2020-12-16 09:45:26 所属栏目:百科 来源:网络整理
导读:再次对xml进行解析,又有了些理解,如果有不对的地方,请给小弟指出,谢谢! [html] view plain copy ? xml version = "1.0" encoding = "UTF-8" ? result meeting addr = "203" creator 张一 / member name 张二 age 20 张三 21 张四 22 meeting meeting ad

再次对xml进行解析,又有了些理解,如果有不对的地方,请给小弟指出,谢谢!

[html] view plain copy
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <result>
  3. meetingaddr="203">
  4. creator>张一</membername>张二age>20>张三>21>张四>22meeting
  5. meetingaddr="204">李一>李二>李三>李四>


1.获取xml文件中的数据:存放到字符串中

[cpp] copy
    //bundle是一个目录,包含了程序会使用到的资源
  1. NSString*path=[[NSBundlemainBundle]pathForResource:@"test"ofType:@"xml"];
  2. NSString*_xmlContent=[[NSStringalloc]initWithContentsOfFile:pathencoding:NSUTF8StringEncodingerror:nil];

用NSXMLParser实现解析:

[plain] copy
    NSXMLParser解析简要说明
  1. 1.是sax方法解析
  2. 2.需要创建NSXMLParser实例(alloc)
  3. 并创建解析器(initWithData:)
  4. 为解析器定义委托(setDelegate:)
  5. 运行解析器(parser)
  6. ++++++当parser初始化并执行parse语句时([parserparse]),程序会跳到代理方法里面走第一个代理方法++++++
  7. 3.这种解析方式是利用它的代理NSXMLParserDelegate实现的
  8. 第一个代理方法:开始处理xml数据,它会把整个xml遍历一遍,识别元素节点名称
  9. -(void)parser:(NSXMLParser*)parserdidStartElement:(NSString*)elementNamenamespaceURI:(NSString*)namespaceURIqualifiedName:(NSString*)qNameattributes:(NSDictionary*)attributeDict;
  10. 第二个代理方法:也就是得到文本节点里存储的信息数据
  11. -(void)parser:(NSXMLParser*)parserfoundCharacters:(NSString*)string;
  12. 第三个代理方法:存储从第二个代理方法中获取到的信息
  13. -(void)parser:(NSXMLParser*)parserdidEndElement:(NSString*)elementNamenamespaceURI:(NSString*)namespaceURIqualifiedName:(NSString*)qName
  14. 这就是解析的过程,在这个过程中会不停的重复的执行这三个代理方法,直到遍历完成
  15. 另外:
  16. 解析开始执行的方法
  17. -(void)parserDidStartDocument:(NSXMLParser*)parser;
  18. 解析结束执行的方法
  19. -(void)parserDidEndDocument:(NSXMLParser*)parser;
  20. 当出现解析错误的时候,会执行这个方法
  21. -(void)parser:(NSXMLParser*)parserparseErrorOccurred:(NSError*)parseError;


解析开始:

2.准备工作:

copy
    NSXMLParser*parse=[[NSXMLParseralloc]initWithData:[_xmlContentdataUsingEncoding:NSUTF8StringEncoding]];
  1. [parsesetDelegate:self];
  2. [parseparse];
  3. [parserelease];

3.三个代理方法具体实现:

copy
    //第一个代理方法:
  1. -(void)parser:(NSXMLParser*)parserdidStartElement:(NSString*)elementNamenamespaceURI:(NSString*)namespaceURIqualifiedName:(NSString*)qualifiedNameattributes:(NSDictionary*)attributeDict
  2. {
  3. //判断是否是meeting
  4. if([elementNameisEqualToString:@"meeting"]){
  5. //判断属性节点
  6. if([attributeDictobjectForKey:@"addr"]){
  7. //获取属性节点中的值
  8. NSString*addr=[attributeDictobjectForKey:@"addr"];
  9. }
  10. }
  11. //判断member
  12. if([elementNameisEqualToString:@"member"]){
  13. NSLog(@"member"]);
  14. //第二个代理方法:
  15. -(void)parser:(NSXMLParser*)parserfoundCharacters:(NSString*)string
  16. {
  17. //获取文本节点中的数据,因为下面的方法要保存这里获取的数据,所以要定义一个全局变量(可修改的字符串)
  18. //NSMutableString*element=[[NSMutableStringalloc]init];
  19. //这里要赋值为空,目的是为了清空上一次的赋值
  20. [elementsetString:@""];
  21. [elementappendString:string];//string是获取到的文本节点的值,只要是文本节点都会获取(包括换行),然后到下个方法中进行判断区分
  22. //第三个代理方法:
  23. void)parser:(NSXMLParser*)parserdidEndElement:(NSString*)elementName
  24. namespaceURI:(NSString*)namespaceURIqualifiedName:(NSString*)qName{
  25. NSString*str=[[NSStringalloc]initWithString:element];
  26. if([elementNameisEqualToString:@"creator"]){
  27. NSLog(@"creator=%@",str);
  28. if([elementNameisEqualToString:@"name"]){
  29. NSLog(@"name=%@",str);
  30. if([elementNameisEqualToString:@"age"]){
  31. NSLog(@"age=%@",108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> [strrelease];
  32. }


注意:

解析xml数据的时候,

每当遇到元素节点的时候都会执行第一个代理方法,如果有属性节点,可以直接在这个方法中获取里面的值;

每当遇到文本节点的时候都会执行第二个代理方法,获取文本节点中的值然后到第三个方法中进行区分。

如果是换行符的话也会获取,因为换行符也是文本节点,不过当一个元素节点结束后的换行符是不会获取的。

比如说: (换行符1)

<li>文本节点</li>

(换行符2)

元素节点前后各有一个换行符,这时只会获取换行符1,而不会获取换行符2。

4.处理错误:打印错误

copy
    -(void)parser:(NSXMLParser*)parserparseErrorOccurred:(NSError*)parseError{
  1. NSLog(@"%@",[parseErrordescription]);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读