2009-08-22 65 views
2

我想弄清楚我的iPhone應用程序的NSXMLParser,雖然我通常明白它是如何工作的,但我仍然對如何提取我需要的值感到困惑。如何使用NSXMLParser解析基本XML文件?

我正在解析的XML結果是非常基本的。它是像這樣:

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

我需要做3兩件事: 獲取的狀態值。 從第一條記錄中獲取內容的值。可能會有一個響應提供多個「記錄」元素,所以我只需要獲取第一個。

我無法弄清楚如何簡單地做到這一點。我所看到的大多數例子都涉及到創建一個單獨的對象來填充這些數據,而我無法看到這對於2個值是必需的。任何人都可以告訴我如何將這兩個數據拉出來,只有第一條記錄?

回答

4

NSXMLParser遇到XML標記時發生的第一件事是調用委託方法parser:didStartElement:namespaceURI:qualifiedName:attributes:;你可能只需要在這裏使用elementName變量。然後,XML解析器讀取標籤中的字符並調用parser:foundCharacters:的內容。最後調用parser:didEndElement:namespaceURI:qualifiedName

,我已經採取了,作爲蘋果在SeismicXML examlple使用這種方法,是如下使用方法:

  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:...我會設置一個標誌是否你已經看到了record標籤之前,如果是這樣,設置contentOfCurrentXMLPropertynil一個BOOL

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>]

...

您可以將相同的邏輯在其他情況下(搜索一個名爲「記錄」標籤的首次啓動,中止在到達結束標記,名爲「記錄」等)

看看這個,並在家中嘗試:Make NSXMLParser your friend..另請參閱API參考Docs for NSXMLParser for addi NSXMLParser委託的委託方法。

+0

感謝你們倆。我終於搞定了。 – SonnyBurnette 2009-08-23 13:58:53