【问题标题】:How do I parse a basic XML file with NSXMLParser?如何使用 NSXMLParser 解析基本的 XML 文件?
【发布时间】:2010-11-21 22:21:54
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    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

    【讨论】:

      【解决方案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 *)

      ...

      [&lt;your statusValueHolder as NSMutableString&gt; appendString:&lt;foundCharacters' parameter&gt;]

      ...

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

      看看这个并在家里尝试一下:Make NSXMLParser your friend.. 另请参阅 NSXMLParser 的 API 参考文档以了解 NSXMLParser 委托的其他委托方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-13
        • 2012-09-02
        • 2023-04-01
        • 1970-01-01
        相关资源
        最近更新 更多