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

时间:2010-10-18 02:32:04

标签: objective-c xml

使用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>

3 个答案:

答案 0 :(得分:1)

您可以使用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;

Apple有一个很好的指南,涵盖NSXMLParser here

答案 1 :(得分:0)

我可以想到三种方法,所有方法都有利有弊。

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

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

  3. 下载图书馆,为您完成肮脏的工作。周围有各种各样的,我有一个(在这里无耻的自我推销)http://github.com/drekka/dXml这可能有所帮助。它当然可以将xml解析为DOM,就像数据结构一样,您可以使用类似XPath的查询来查找节点并转换回字符串。这样做的缺点是你现在正在使用第三方库。

答案 2 :(得分:0)

我昨晚有一个脑波,这是我提出的解决方案......看起来有点不雅,但它确实有效。

- (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];
    }
}