如何使用NSXMLParser解析基本XML文件?

时间:2009-08-22 16:42:12

标签: iphone objective-c xml cocoa-touch nsxmlparser

我正在尝试为我的iPhone应用程序找出NSXMLParser,虽然我一般都了解它是如何工作的,但我仍然对如何提取我需要的值感到困惑。

我正在解析的XML结果非常基础。就像这样:

<start>
 <status>300</status>
 <record>
  <title>The Title</title>
  <content>Some content</content>
 </record>
</start>

我需要做三件事: 获得状态的价值。 从第一条记录中获取内容的价值。可能会有一个响应,提供多个“记录”元素,所以我只需要获得第一个。

我无法弄清楚如何做到这一点。我见过的大多数示例都涉及创建一个单独的对象来填充这些数据,我看不出这对于2个值是必要的。任何人都可以告诉我如何将这2个数据拉出来并仅用于第一个记录吗?

2 个答案:

答案 0 :(得分:4)

NSXMLParser遇到XML标记时发生的第一件事是委托方法parser:didStartElement:namespaceURI:qualifiedName:attributes:被调用;你可能只需要在这里使用elementName变量。然后,XML解析器读取标记中的字符并使用内容调用parser:foundCharacters:。最后调用parser:didEndElement:namespaceURI:qualifiedName

正如Apple在 SeismicXML 中所使用的那样,我采用的方法是使用以下方法:

  1. parser:didStartElement:namespaceURI:qualifiedName:attributes:中,将元素名称的字符串与已知值进行比较,以查看它是否是您关心的字符串。如果是,则将实例变量(NSMutableString;我将其称为contentOfCurrentXMLProperty)设置为空字符串。否则将其设置为nil
  2. parser:foundCharacters:中,将找到的字符追加到contentOfCurrentXMLProperty
  3. parser:didEndElement:namespaceURI:qualifiedName中,将contentofCurrentXMLProperty的值分配给适当的变量。
  4. 有关详细信息,请参阅 SeismicXML 示例。

    关于您的具体情况的一些事项:首先,由于XML解析器只返回字符串,因此您需要将字符串转换为status的整数(或您正在使用的任何数据类型)。

    其次,由于您只需要record的第一个值,因此在parser:didStartElement:...我设置了BOOL,标记您是否已经看到record标记之前和,如果是,请将contentOfCurrentXMLProperty设置为nil

答案 1 :(得分:2)

请记住,NSXMLParser是类似SAX的基于事件的解析器,您必须设置解析器,启动它并侦听关键事件。

设置解析器:

NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
[parser setDelegate:self];
[parser parse];

覆盖这些方法:

– parser:didStartElement:namespaceURI:qualifiedName:attributes:
– parser:didEndElement:namespaceURI:qualifiedName:
– parser:foundCharacters:

你的功能必须基本上说:

  • 当您到达标签的下一个开头时:

-(void)parser: didStartElement:(NSString *) namespaceURI:(NSString *) qualifiedName:(NSString *) attributes:(NSDictionary *)

  • 如果该标签的名称是“status”:

[elementName isEqualToString:@"status"]

  • 给我标签的字符串数据:

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

...

[<your statusValueHolder as NSMutableString> appendString:<foundCharacters' parameter>]

...

您可以为其他案例应用相同的逻辑(搜索名为“record”的标记的第一个开头,到达标记末尾时中止,名为“record”等)

查看此内容并在家中进行尝试:Make NSXMLParser your friend..另请参阅NSXMLParser的API参考文档,了解NSXMLParser委托的其他委托方法。