在Objective-C中解析简单XML

在Objective-C中解析简单XML,objective-c,xml,cocoa,macos,Objective C,Xml,Cocoa,Macos,我从使用ASIHttpRequest连接的Web服务器返回了以下非常简单的XML: <element1>something</element1> <element2>somethingelse</element2> <element3>anotherthing</element3> 什么 某物 另一件事 ASIHttpRequest可以将其作为NSData或NSString返回。我需要解析信息,最简单的方法是什么 谢谢有

我从使用ASIHttpRequest连接的Web服务器返回了以下非常简单的XML:

<element1>something</element1>
<element2>somethingelse</element2>
<element3>anotherthing</element3>
什么 某物 另一件事 ASIHttpRequest可以将其作为NSData或NSString返回。我需要解析信息,最简单的方法是什么


谢谢

有一些XML解析器可用于iOS NSXMLParser、libxml2(DOM和SAX)、TBXML和KissXML。您可以参考选择最佳XML解析器(速度和内存占用)。最简单的是TBXML。NSXMLParser也很简单

NSXMLParser* xmlParser = [[NSXMLParser alloc] initWithData:receivedXMLData];//init NSXMLParser with receivedXMLData
[xmlParser setDelegate:self]; // Set delegate for NSXMLParser
[xmlParser parse]; //Start parsing
[xmlParser release];

//Delegate Methods
//Have a instance variable NSMutableString* currentString; to hold data between elements and NSMutableArray* elementsArray; to hold parsed data

- (void)parserDidStartDocument:(NSXMLParser *)parser
{
    elementsArray = [[NSMutableArray alloc] init];
}

//store all found characters between elements in currentString mutable string
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    if(!currentString)
    {
        currentString = [[NSMutableString alloc] init];
    }
    [currentString appendString:string];    
}

//When end of XML tag is found this method gets notified
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    if([elementName isEqualToString:@"element1"])
    {
        [elementsArray addObject:currentString];
        [currentString release],currentString=nil;
        return;
    }
    if([elementName isEqualToString:@"element2"])
    {
        [elementsArray addObject:currentString];
        [currentString release],currentString=nil;
        return;
    }
    if([elementName isEqualToString:@"element3"])
    {
        [elementsArray addObject:currentString];
        [currentString release],currentString=nil;
        return;
    }
    [currentString release],currentString =nil;
}

//Parsing has ended
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    NSLog(@"Content of Elements Array: %@",elementsArray);
        [elementsArray release],elementsArray=nil;
}

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
    UIAlertView* parseErrorAlert = [[UIAlertView alloc] initWithTitle:@"Parse Error" message:[NString stringWithFormat:"%@",[parseError localizedDescription]] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
    [parseErrorAlert show];
    [parseErrorAlert release];
}
您还有其他委托方法,如ParseErrorOccursed。提及

对于TBXML: 更新:已实现parseError委托方法和有效的xml示例 您在代码中发布的XML不是有效的XML(您可以在线检查XML验证:),因此它将抛出一个解析错误。以下是您发布的XML的有效XML:

<?xml version="1.0"?>
<root>
 <element1>something</element1>
 <element2>somethingelse</element2>
 <element3>anotherthing</element3>
</root>

某物
某物
另一件事

有一些XML解析器可用于iOS NSXMLParser、libxml2(DOM和SAX)、TBXML和KissXML。您可以参考选择最佳XML解析器(速度和内存占用)。最简单的是TBXML。NSXMLParser也很简单

NSXMLParser* xmlParser = [[NSXMLParser alloc] initWithData:receivedXMLData];//init NSXMLParser with receivedXMLData
[xmlParser setDelegate:self]; // Set delegate for NSXMLParser
[xmlParser parse]; //Start parsing
[xmlParser release];

//Delegate Methods
//Have a instance variable NSMutableString* currentString; to hold data between elements and NSMutableArray* elementsArray; to hold parsed data

- (void)parserDidStartDocument:(NSXMLParser *)parser
{
    elementsArray = [[NSMutableArray alloc] init];
}

//store all found characters between elements in currentString mutable string
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    if(!currentString)
    {
        currentString = [[NSMutableString alloc] init];
    }
    [currentString appendString:string];    
}

//When end of XML tag is found this method gets notified
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    if([elementName isEqualToString:@"element1"])
    {
        [elementsArray addObject:currentString];
        [currentString release],currentString=nil;
        return;
    }
    if([elementName isEqualToString:@"element2"])
    {
        [elementsArray addObject:currentString];
        [currentString release],currentString=nil;
        return;
    }
    if([elementName isEqualToString:@"element3"])
    {
        [elementsArray addObject:currentString];
        [currentString release],currentString=nil;
        return;
    }
    [currentString release],currentString =nil;
}

//Parsing has ended
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    NSLog(@"Content of Elements Array: %@",elementsArray);
        [elementsArray release],elementsArray=nil;
}

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
    UIAlertView* parseErrorAlert = [[UIAlertView alloc] initWithTitle:@"Parse Error" message:[NString stringWithFormat:"%@",[parseError localizedDescription]] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
    [parseErrorAlert show];
    [parseErrorAlert release];
}
您还有其他委托方法,如ParseErrorOccursed。提及

对于TBXML: 更新:已实现parseError委托方法和有效的xml示例 您在代码中发布的XML不是有效的XML(您可以在线检查XML验证:),因此它将抛出一个解析错误。以下是您发布的XML的有效XML:

<?xml version="1.0"?>
<root>
 <element1>something</element1>
 <element2>somethingelse</element2>
 <element3>anotherthing</element3>
</root>

某物
某物
另一件事

也请尝试。如果您想在项目中保持cocoa风格,这可能会有所帮助。

也可以尝试。如果您想在项目中保留cocoa样式,这可能会有所帮助。

可能重复的可能重复的可能重复的可能重复的可能重复的可能重复的谢谢,这段代码很棒,但它似乎只是出于某种原因存储了元素1。因为XML验证在第2行失败。如果实现ParseErrorOccursed委托方法,它将抛出具有本地化描述的NSError对象,错误代码。这是正确格式化的xml,有些东西,有些东西,另一些东西,谢谢,我必须将它们附加到字符串中,因为我正在使用的api刚刚给出了我在原始问题中所说的内容。感谢您的帮助使其工作正常,使用正确的xml格式和api请求中的元素构建了nsmutablestring,将其转换为nsdata并将其传递给解析器。非常感谢您,这段代码很棒,但它似乎只是出于某种原因存储了element1,因为XML验证在第2行失败了。如果实现ParseErrorOccursed委托方法,它将抛出具有本地化描述的NSError对象,错误代码。这是正确格式化的xml,有些东西,有些东西,另一些东西,谢谢,我必须将它们附加到字符串中,因为我正在使用的api刚刚给出了我在原始问题中所说的内容。感谢您的帮助使其工作正常,使用正确的xml格式和api请求中的元素构建了nsmutablestring,将其转换为nsdata并将其传递给解析器。非常感谢