Objective-C - 如何单独解析XML的属性?

时间:2015-04-12 20:55:06

标签: ios xml xml-parsing

我正在使用UITableView中使用XML解析的应用程序。我无法弄清楚我是如何分别解析属性rok1rok2的。如果我使用[_element isEqualToString: @ "jmeno"]应用程序运行良好,但它会UITableView rok1 rok2- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { self.element = elementName; if ([_element isEqualToString:@"rok1"]) { _item = [[NSMutableDictionary alloc] init]; self.nazev = [[NSMutableString alloc] init]; self.definice = [[NSMutableString alloc] init]; } } - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { if ([self.element isEqualToString:@"nazev"]) { [self.nazev appendString:string]; } else if ([self.element isEqualToString:@"def"]) { [self.definice appendString:string]; } } - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { if ([elementName isEqualToString:@"rok1"]) { Slova *thisSvatek = [[Slova alloc] initWithName:self.nazev definice:self.definice]; [self.svatkyArray addObject:thisSvatek]; } self.element = nil; } 向我显示,并且不需要它。谢谢你的帮助。

有我的解析器代码:

<?xml version="1.0" encoding="UTF-8" ?>
<menu>
    <rok1>
        <jmeno>
        <nazev>Prvni</nazev>
        <def>blblbla</def>
        <jmeno>
        <nazev>Druhy</nazev>
        <def>blbablabal</def>
        </jmeno>
   </rok1>
   <rok2>
        <jmeno>
        <nazev>Prvni</nazev>
        <def>blblbla</def>
        </jmeno>
   </rok2>
</menu>

我的XML示例:

{{1}}

1 个答案:

答案 0 :(得分:1)

在解析XML文档时,需要跟踪“状态”。一种简单的方法就是添加一个布尔属性,指示您正在处理目标元素的“内部”。

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

    self.element = elementName;

    if ([elementName isEqualToString:@"rok1"])
    {
        self.foundTarget=YES;
        self.nazev   = [[NSMutableString alloc] init];
        self.definice    = [[NSMutableString alloc] init];
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{ 
    if (self.foundTarget) {
        if ([self.element isEqualToString:@"nazev"])
        {
            [self.nazev appendString:string];
        }
        else if ([self.element isEqualToString:@"def"])
        {
            [self.definice appendString:string];
        }
    }
}

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

    if ([elementName isEqualToString:@"rok1"])
    {
        Slova *thisSvatek = [[Slova alloc] initWithName:self.nazev
                                              definice:self.definice];
        [self.svatkyArray addObject:thisSvatek];
        self.foundTarget=NO;
    }
    self.element = nil;
}

更复杂的方法是构建某种数据结构,例如代表XML的字典

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

    self.element = elementName;

    if ([elementName isEqualToString:@"rok1"]  || [elementName.isEqualToString:@"rok2"])
    {
        self.nazev   = [[NSMutableString alloc] init];
        self.definice    = [[NSMutableString alloc] init];
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{ 
        if ([self.element isEqualToString:@"nazev"])
        {
            [self.nazev appendString:string];
        }
        else if ([self.element isEqualToString:@"def"])
        {
            [self.definice appendString:string];
        }
}

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

    if ([elementName isEqualToString:@"rok1"]  || [elementName.isEqualToString:@"rok2"])
        Slova *thisSvatek = [[Slova alloc] initWithName:self.nazev
                                              definice:self.definice];
        self.rokDictionary[elementName]=thisSvatek; // self.rokDictionary is an NSMutableDictionary
    }
    self.element = nil;
}

要分离出各种“jmeno”标签,您需要在didStartElement&amp; didEndElement -

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

    self.element = elementName;

    if ([elementName isEqualToString:@"rok1"]  || [elementName.isEqualToString:@"rok2"])
    {
        self.jmenoArray=[NSMutableArray new];
    }
    else if ([elementName isEqualToString:@"jmeno"]) {
        self.nazev   = [[NSMutableString alloc] init];
        self.definice    = [[NSMutableString alloc] init];
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{ 
        if ([self.element isEqualToString:@"nazev"])
        {
            [self.nazev appendString:string];
        }
        else if ([self.element isEqualToString:@"def"])
        {
            [self.definice appendString:string];
        }
}

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

    if ([elementName isEqualToString:@"jmeno"]) {
        Slova *thisSvatek = [[Slova alloc] initWithName:self.nazev
                                              definice:self.definice];
        [self.jemnoArray addObject:thisSvatek];
    } 
    else if ([elementName isEqualToString:@"rok1"]  || [elementName.isEqualToString:@"rok2"])

        self.rokDictionary[elementName]=self.jmenoArray; // self.rokDictionary is an NSMutableDictionary
        self.jmenoArray=nil;
    }
    self.element = nil;
}