我正在尝试为我的iPhone应用程序找出NSXMLParser,虽然我一般都了解它是如何工作的,但我仍然对如何提取我需要的值感到困惑。
我正在解析的XML结果非常基础。就像这样:
<start>
<status>300</status>
<record>
<title>The Title</title>
<content>Some content</content>
</record>
</start>
我需要做三件事: 获得状态的价值。 从第一条记录中获取内容的价值。可能会有一个响应,提供多个“记录”元素,所以我只需要获得第一个。
我无法弄清楚如何做到这一点。我见过的大多数示例都涉及创建一个单独的对象来填充这些数据,我看不出这对于2个值是必要的。任何人都可以告诉我如何将这2个数据拉出来并仅用于第一个记录吗?
答案 0 :(得分:4)
NSXMLParser
遇到XML标记时发生的第一件事是委托方法parser:didStartElement:namespaceURI:qualifiedName:attributes:
被调用;你可能只需要在这里使用elementName
变量。然后,XML解析器读取标记中的字符并使用内容调用parser:foundCharacters:
。最后调用parser:didEndElement:namespaceURI:qualifiedName
。
正如Apple在 SeismicXML 中所使用的那样,我采用的方法是使用以下方法:
parser:didStartElement:namespaceURI:qualifiedName:attributes:
中,将元素名称的字符串与已知值进行比较,以查看它是否是您关心的字符串。如果是,则将实例变量(NSMutableString
;我将其称为contentOfCurrentXMLProperty
)设置为空字符串。否则将其设置为nil
。parser:foundCharacters:
中,将找到的字符追加到contentOfCurrentXMLProperty
。parser:didEndElement:namespaceURI:qualifiedName
中,将contentofCurrentXMLProperty
的值分配给适当的变量。有关详细信息,请参阅 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 *)
[elementName isEqualToString:@"status"]
- (void)parser:(NSXMLParser *) foundCharacters:(NSString *)
...
[<your statusValueHolder as NSMutableString> appendString:<foundCharacters' parameter>]
...
您可以为其他案例应用相同的逻辑(搜索名为“record”的标记的第一个开头,到达标记末尾时中止,名为“record”等)
查看此内容并在家中进行尝试:Make NSXMLParser your friend..另请参阅NSXMLParser的API参考文档,了解NSXMLParser委托的其他委托方法。