2

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

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

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

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

我不知道如何简单地做到这一点。我见过的大多数示例都涉及创建一个单独的对象来填充这些数据,我看不出这对于 2 个值是必要的。谁能告诉我如何提取这两条数据并且仅用于第一条记录?

4

2 回答 2

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适当的变量。

有关详细信息,请参阅SeismicXML示例。

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

其次,由于您只想要 的第一个值record,因此parser:didStartElement:...我会设置一个BOOL标记您之前是否已经看过 record标签,如果是,则设置contentOfCurrentXMLPropertynil

于 2009-08-22T17:22:18.377 回答
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 *)

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

[elementName isEqualToString:@"status"]

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

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

...

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

...

您可以对另一种情况应用相同的逻辑(搜索名为“record”的标签的第一个开始,在到达标签末尾时中止,名为“record”等)

看看这个并在家里尝试一下:让 NSXMLParser 你的朋友..另请参阅 NSXMLParser 的 API 参考文档以获取 NSXMLParser 委托的其他委托方法。

于 2009-08-22T17:22:49.827 回答