nsxmlparser 详解

前端之家收集整理的这篇文章主要介绍了nsxmlparser 详解前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

再次对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]);
原文链接:https://www.f2er.com/xml/298669.html

猜你在找的XML相关文章