Objective c 在目标C中的节点处获取XML内容

Objective c 在目标C中的节点处获取XML内容,objective-c,xml,Objective C,Xml,使用Objective C-我希望循环遍历XML树,并在与特定元素名称匹配的特定节点的每个实例上显示完整的XML内容 例如,我希望在元素b的每个实例中获得XML(表示为NSString)。如果元素b中只有一个字符串,我就可以得到该值,但是如何获得包含所有元素名称的XML格式的NSString表示 <element a> <element b> <element c> some text 1 </eleme

使用Objective C-我希望循环遍历XML树,并在与特定元素名称匹配的特定节点的每个实例上显示完整的XML内容

例如,我希望在元素b的每个实例中获得XML(表示为NSString)。如果元素b中只有一个字符串,我就可以得到该值,但是如何获得包含所有元素名称的XML格式的NSString表示

<element a>
   <element b>
      <element c>
          some text 1
      </element c>
   </element b>
   <element b>
      <element c>
          some text 2
      </element c>
   </element b>
   <element b>
      <element c>
          some text 3
      </element c>
   </element b>
</element a>

一些文本1
一些文本2
一些文本3

您可以使用NSXMLParser来完成此操作。类别(1)的三个主要部分检查开口标签:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
  attributes:(NSDictionary *)attributeDict;
(2) 抓取遇到的节点内的内容:

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;
以及(3)在节点完成时将数据存储到您选择的适当位置:

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

苹果公司有一本极好的指南介绍NSXMLParser,我可以想到三种方法,它们各有优缺点

  • 解析为字符串。根据您想要提取的具体内容,您可以使用字符串操作代码来搜索和提取您想要的位。这会忽略xml结构,并将问题简化为简单的字符串处理问题。但根据xml和所需的节点,可能还不够聪明

  • 编写一个NSXMLParser,将xml字符串解析为某种数据结构(即DOM),找到需要的节点,然后让它们生成xml。同样取决于你想要什么,这个可能太重了。也可能意味着更多的编码

  • 下载一个库来为你做这些肮脏的工作。有各种各样的,我有一个在(无耻的自我推销这里),这可能会有所帮助。它当然可以将xml解析为类似DOM的数据结构,从中可以使用类似XPath的查询来查找节点并转换回字符串。这样做的缺点是您现在使用的是第三方库


  • 昨晚我灵机一动,这是我想出的解决办法。。。看起来有点不雅观,但确实有效

    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
    
        if ([elementName isEqualToString:@"element b"])
            {
            area = [[NSMutableString alloc] init];
            current_element = [elementName copy];
            }
        else if ([current_element isEqualToString:@"element b"])
            {
                NSString *tag = [NSString stringWithFormat:@"<%@>", elementName];
                [area appendString:tag];
            }
        }
    
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
        if ([elementName isEqualToString:@"element b"])
        {
            NSLog(@"tag info: %@", area);
        }
        else if ([current_element isEqualToString:@"element b"])
        {
            NSString *tag = [NSString stringWithFormat:@"</%@>", elementName];
            [area appendString:tag];
        }
    }
    
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
        if ([current_element isEqualToString:@"element b"]) {
            [area appendString:string];
        }
    }
    
    -(void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName属性:(NSDictionary*)attributeDict{
    if([elementName IsequalString:@“element b”])
    {
    area=[[NSMutableString alloc]init];
    当前_元素=[elementName copy];
    }
    else if([当前元素IsequalString:@“元素b”])
    {
    NSString*标记=[NSString stringWithFormat:@',elementName];
    [区域追加字符串:标记];
    }
    }
    -(void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName{
    if([elementName IsequalString:@“element b”])
    {
    NSLog(@“标签信息:%@”,区域);
    }
    else if([当前元素IsequalString:@“元素b”])
    {
    NSString*标记=[NSString stringWithFormat:@',elementName];
    [区域追加字符串:标记];
    }
    }
    -(void)解析器:(NSXMLParser*)解析器查找字符:(NSString*)字符串{
    if([current_element IsequalString:@“element b”]){
    [区域追加字符串:字符串];
    }
    }
    
    哦,等等。我完全误解了你的问题。可以说,您正在寻找从XML中解析XML的方法。我想,使用NSXMLParser的这个标准实现,你可以通过知道你在任何给定的时间都在哪个节点上来重构你所需要的东西……我想这有点过于苛刻了。这很重要:平台是iPhone还是Mac OS X?原因是OS X Cocoa包含XML DOM类,但iPhone没有。除非他的目标平台是OS X,它内置了XML DOM类。Doh!我假设iPhone:-)