使用NSXML Parser Objective-C解析XML时选择标签

时间:2012-03-02 19:23:17

标签: objective-c xml nsxmlparser

我的解析xml正在工作,但我想拿起一个值,实际上我的解析器在NSDictionnary中读取和写入它们

让我告诉你

我正在谈论的xml:XML

正如你所看到的,主标签是“marche”,有7个标签“echeance”。在每个标签中,我们有10个最后日期,每个“日期”包含几个值。

实际上,我想获得这些值,只有那些值:

  • 对于每个“echeance”,请为标签“echeance”和“sett”以及最近日期的变化(每个echeance)选择attibute“nom”。

这就是我得到的结果:

2012-03-02 20:04:08.576 XML[4497:f803] stories :(
    {
    echeance = "Mars 2012\n    ";
    settle = "205.25\n      205.5\n      206\n      205\n      202.75\n      204\n      204.75\n      206.5\n      206.25\n      210\n      ";
    variation = "-0.25\n    \n    -0.5\n    \n    1\n    \n    2.25\n    \n    -1.25\n    \n    -0.75\n    \n    -1.75\n    \n    0.25\n    \n    -3.75\n    \n    1.5\n    \n    ";
},
    {
    echeance = "Juin 2012\n    ";
    settle = "207.75\n      207.5\n      207.25\n      206\n      204.75\n      205.5\n      206.25\n      207.25\n      206.5\n      210.5\n      ";
    variation = "0.25\n    \n    0.25\n    \n    1.25\n    \n    1.25\n    \n    -0.75\n    \n    -0.75\n    \n    -1\n    \n    0.75\n    \n    -4\n    \n    0.75\n    \n    ";
},
    {
    echeance = "Ao\U00fbt 2012\n    ";
    settle = "209.75\n      209.25\n      208.5\n      207.25\n      205.75\n      207.25\n      207.75\n      208.75\n      208.5\n      211.75\n      ";
    variation = "0.5\n    \n    0.75\n    \n    1.25\n    \n    1.5\n    \n    -1.5\n    \n    -0.5\n    \n    -1\n    \n    0.25\n    \n    -3.25\n    \n    0.25\n    \n    ";
},
    {
    echeance = "Novembre 2012\n    ";
    settle = "188.25\n      188\n      186.75\n      186.25\n      184.75\n      184.75\n      186.5\n      186\n      185\n      188.5\n      ";
    variation = "0.25\n    \n    1.25\n    \n    0.5\n    \n    1.5\n    \n    0\n    \n    -1.75\n    \n    0.5\n    \n    1\n    \n    -3.5\n    \n    1\n    \n    ";
},
    {
    echeance = "Janvier 2013\n    ";
    settle = "189.75\n      189\n      189.5\n      188.75\n      187.25\n      187.25\n      188.5\n      188.5\n      187.5\n      190\n      ";
    variation = "0.75\n    \n    -0.5\n    \n    0.75\n    \n    1.5\n    \n    0\n    \n    -1.25\n    \n    0\n    \n    1\n    \n    -2.5\n    \n    0\n    \n    ";
},
    {
    echeance = "Mars 2013\n    ";
    settle = "191\n      191\n      191.5\n      190.75\n      189.25\n      189.25\n      190.5\n      190.5\n      189.5\n      192\n      ";
    variation = "0\n    \n    -0.5\n    \n    0.75\n    \n    1.5\n    \n    0\n    \n    -1.25\n    \n    0\n    \n    1\n    \n    -2.5\n    \n    1\n    \n    ";
},
    {
    echeance = "Juin 2013\n    ";
    settle = "194.5\n      194.5\n      195.5\n      194.75\n      193.25\n      193.25\n      194.5\n      194.5\n      193.5\n      196\n      ";
    variation = "0\n    \n    -1\n    \n    0.75\n    \n    1.5\n    \n    0\n    \n    -1.25\n    \n    0\n    \n    1\n    \n    -2.5\n    \n    3\n    \n    ";
}

正如你所看到的,我有一个美丽的NSDictionnary“故事”,每个“nom”为“echeance BUT for”和解“和变异”,我有每个“echeance”的所有日期的值,而不仅仅是最近。

如果我的解析器可以工作,我应该有类似的东西:

2012-03-02 20:04:08.576 XML[4497:f803] stories :(
    {
    echeance = "Mars 2012";
    settle = "205.25"
    variation = "-0.25"
},
    {
    echeance = "Juin 2012";
    settle = "207.75"
    variation = "0.25"

..... ..... .....
ETC ......

这是我的代码:

我的.m型号:

    #import "XMLParser.h"

@implementation XMLParser

@synthesize stories;
@synthesize delegate;

- (void)parseXMLAtURL:(NSURL*)path 

{
    stories = [[NSMutableArray alloc] init];

    textParser = [[NSXMLParser alloc] initWithContentsOfURL:path];

    [textParser setDelegate:self];

    [textParser parse];

}


- (void)parserDidStartDocument:(NSXMLParser *)parser 
{

}

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError 

{
    NSString * errorString = [NSString stringWithFormat:@"Impossible de parser le document (Code erreur %i )", [parseError code]];

    NSLog(@"erreur de parsing XML: %@", errorString);

    UIAlertView * errorAlert = [[UIAlertView alloc] initWithTitle:@"Erreur lors du chargement" message:errorString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];

    [errorAlert show];
    [errorAlert release];

}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if(currentElement)
    {
        [currentElement release];
        currentElement = nil;
    }
    currentElement = [elementName copy];

    if ([elementName isEqualToString:kExpiry]) 

    {

        if(item)
        {
            [item release];
            item = nil;
        }
        if(currentExpiry)
        {
            [currentExpiry release];
            currentExpiry = nil;
        }
        if(currentSettle)
        {   
            [currentSettle release];
            currentSettle = nil;
        }
        if(currentVariation)
        {
            [currentVariation release];
            currentVariation = nil;
        }

        item = [[NSMutableDictionary alloc] init];
        currentVariation = [[NSMutableString alloc] init];
        currentSettle = [[NSMutableString alloc] init];
        currentExpiry = [[NSMutableString alloc] initWithFormat:[attributeDict objectForKey:@"nom"]];


    }
}

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

{
    if ([elementName isEqualToString:kExpiry]) 

    {
        [item setObject:currentExpiry forKey:kExpiry];
        [item setObject:currentSettle forKey:kCloture];
        [item setObject:currentVariation forKey:kChange];

        [stories addObject:item];

    }   
    //NSLog(@"compteur : %i",compteur);

}

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

{

    // on sauve les éléments de l' echeancepour l'item en cours
    if ([currentElement isEqualToString:kCloture])
        [currentSettle appendString:string];
    else if ([currentElement isEqualToString:kExpiry])
        [currentExpiry appendString:string];
    else if ([currentElement isEqualToString:kChange])
        [currentVariation appendString:string];
}

- (void)parserDidEndDocument:(NSXMLParser *)parser 

{

    NSLog(@"C’est fini !");
    NSLog(@"stories a %d echeances", [stories count]);
    NSLog(@"stories :%@", stories);
    [self performSelectorOnMainThread:@selector(tellTheDelegateItIsFinished) withObject:nil waitUntilDone:NO];
}

- (void) tellTheDelegateItIsFinished {
    [delegate xmlParserdidFinishParsing];   
}

- (void) dealloc 

{
    [stories release];
    [textParser release];
    [item release];
    [currentVariation release];
    [currentExpiry release];
    [currentSettle release];

    [super dealloc];

}
@end

我想我需要“计算”并只选择我需要的值,但它不起作用

我遇到的另一个问题是“\ n”。我无法避免那些“\ n”:(但主要的问题是拿起“好的价值观”;)

全部谢谢

1 个答案:

答案 0 :(得分:0)

在我看来,问题可能是您没有在didEndElement实现中停止解析。您有一行if ([elementName isEqualToString:kExpiry]),这就是为什么您只能获得一个日期。但你不要为“定居”和“变异”这样做,所以你得到了所有这些。您将它们添加到字典中,然后将字典添加到数组中,但这些只是指针,因此数据不断进入并且不断添加到数组中 - 在数组内的字典内。

相关问题