我xml的工作代码

时间:2011-04-27 07:41:55

标签: iphone

解析进展顺利。但是我无法在“Book”类的'aBook'对象中获得价值(而aBook具有Book类的所有属性,如'id','iid','catname','subcatname','url'i.e声明并保留)。怎样做在aBook中获取值?

这是gdb输出:

 
  2011-04-28 15:08:12.046 XML[7053:20b] Processing Element: Table
2011-04-28 15:08:12.047 XML[7053:20b] Processing Value: 


2011-04-28 15:08:12.048 XML[7053:20b] Processing Element: id
2011-04-28 15:08:12.048 XML[7053:20b] Processing Value: 

    1
2011-04-28 15:08:12.049 XML[7053:20b] Processing Value: 

2011-04-28 15:08:12.050 XML[7053:20b] Processing Element: catname
2011-04-28 15:08:12.050 XML[7053:20b] Processing Value: 
    Birthday
2011-04-28 15:08:12.051 XML[7053:20b] Processing Value: 

2011-04-28 15:08:12.051 XML[7053:20b] Processing Element: iid
2011-04-28 15:08:12.051 XML[7053:20b] Processing Value: 
    1
2011-04-28 15:08:12.052 XML[7053:20b] Processing Value: 

2011-04-28 15:08:12.052 XML[7053:20b] Processing Element: subcatname
2011-04-28 15:08:12.052 XML[7053:20b] Processing Value: 
    card1
2011-04-28 15:08:12.053 XML[7053:20b] Processing Value: 

2011-04-28 15:08:12.053 XML[7053:20b] Processing Element: url
2011-04-28 15:08:12.053 XML[7053:20b] Processing Value: 
    http://www.orkutpapa.com/scraps/happy-birthday-card-2-3.jpg
2011-04-28 15:08:12.054 XML[7053:20b] Processing Value: 
  

这里是我的代码:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
    attributes:(NSDictionary *)attributeDict {

    if([elementName isEqualToString:@"NewDataSet"]) {
        //Initialize the array.
    appDelegate.books = [[NSMutableArray alloc] init];
    }
    else if([elementName isEqualToString:@"Table"]) {
        aBook = [[Book alloc] init];

    }
    NSLog(@"Processing Element: %@", elementName);
}

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

    if(!currentElementValue) 
        currentElementValue = [[NSMutableString alloc] initWithString:string];
    else 
    [currentElementValue appendString:string];

    NSLog(@"Processing Value: %@", currentElementValue);

}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

    if([elementName isEqualToString:@"Table"]) {
        [appDelegate.books addObject:aBook];

        [aBook release];
        aBook = nil;
    }

    else if([elementName isEqualToString:@"catname"])
    {
        [aBook setValue:currentElementValue forKey:@"catname"];
       NSLog(@"elementName for catname....%@",currentElementValue);
        NSLog(@"aBook for catname....%@",aBook);
    }
    else if([elementName isEqualToString:@"subcatname"])
    {
        [aBook setValue:currentElementValue forKey:@"subcatname"];
        NSLog(@"elementName for catname....%@",currentElementValue);
        NSLog(@"aBook for catname....%@",aBook);
    }

    else if ([elementName isEqualToString:@"url"]) {
            [aBook setValue:currentElementValue forKey:@"url"];

        // [aBook setValue:currentElementValue forKey:elementName];
        NSLog(@"elementName for url....%@",currentElementValue);
        NSLog(@"aBook for url....%@",aBook);    
    }
        [currentElementValue release];
    currentElementValue = nil;
}

2 个答案:

答案 0 :(得分:0)

以下是我将使用的xml代码:

<?xml version="1.0"?>
<elements>
<element id="1" catname="Birthday" iid="1" subcatname="card1" url="http://www.orkutpapa.com/scraps/happy-birthday-card-2-3.jpg" />
</elements>

使用上面的XML格式,'elements'包含所有xml记录。 'element'表示具有以下变量的一条记录:id,catname,iid,subcatname和url。您可以根据自己的喜好更改这些,但请注意这些变量名称。这是解析时调用数据的方法。

你需要在某处制作NSURLConnection。例如,这可以响应UITouch或放在viewWillAppear中。我将假设您知道如何建立此连接,但它应包含以下方法:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

此方法应重置数据,因为收到的回复不完整。

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

此方法是您可以将数据附加到NSMutableData

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

这应该处理错误,释放连接并释放NSMutableData。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

此方法应调用startParsingData并释放连接。

现在您可能感兴趣的部分(对不起,如果您知道上面的NSURLConnection参考),如何解析数据:

- (void)startParsingData
{
    NSXMLParser *myDataParser = [[NSXMLParser alloc] initWithData:receivedFriendData];
    myDataParser.delegate = self;
    [myDataParser parse];
    [myDataParser release];
    [myNSMutableData release];
}

在此方法中,您应该初始化数据解析器并分配委托。确保将NSXMLParserDelegate协议分配给您的类。

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if ([elementName isEqualToString:@"element"])
    {

        NSString *url = [NSString stringWithFormat:@"%@", [attributeDict objectForKey:@"url"]];

        // Now do with your URL as you please =) 

    }
} 

请注意,attributeDict调用objectForKey。此键应与要调用和使用的xml文件中的变量名匹配。另请注意,elementName('element')与xml文件中的记录名称匹配。

如果有帮助或者您有任何其他问题,请告诉我们!

干杯, 埃文

答案 1 :(得分:0)

如果您只需阅读XML,我建议您使用TouchXML。如果您还想写入XML,请改用KissXML。适用于iOS的NSXMLParser版本是重量级的。