2013-12-24 3 views
0

У меня есть пример XML:NSXMLParser значение синтаксического анализа на основе атрибута элемента

<book id="bk101"> 
    <title>XML Developer's Guide</title> 
</book> 
<book id="bk102"> 
    <title>Midnight Rain</title> 
</book> 

Как я могу выходное значение названия для книги с идентификатором «bk101»?

Мой код:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict 
{ 
    if ([elementName isEqualToString:@"book"]) 
    { 
     NSString *codeValue = [attributeDict objectForKey:@"id"]; 

     if ([codeValue isEqualToString:@"bk101"]) { 
      //NSLog(@"found"); // output book title here 
     } 
    } 
} 
+0

Не могли бы вы напечатать атрибутDict? – Nirav

ответ

3

Пусть структура XML, такие как в примере и тег не имеет дочерних элементов и текст внутри тега не имеют Юникода или другие специальные символы. Тогда для вывода на консоль (например) «название» значение книги с идентификатором «bk101» Вы должны:

  1. Declare codeValue в собственность.

    @property (strong, nonatomic) NSString *codeValue; 
    
  2. Измените код, как показано ниже:

    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict 
    { 
        if ([elementName isEqualToString:@"book"]) 
        { 
         _codeValue = [attributeDict objectForKey:@"id"]; 
        } 
    } 
    
  3. Добавить реализацию foundCharacters: метод, как показано ниже:

    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
    { 
        if ([_codeValue isEqualToString:@"bk101"]) 
        { 
        NSLog(@"found: %@", string); // output book title here 
        } 
    } 
    
  4. Добавить реализацию didEndElement: метод, как показано ниже (выборочно для случая, когда не все теги «book» будут иметь атрибут):

    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
    { 
        if (_codeValue != nil) 
        { 
        _codeValue = nil 
        } 
    } 
    

ПРИМЕЧАНИЕ: Если условия, указанные в начале поста будет отличаться - вам может понадобиться другой реализации.

качестве альтернативы вы можете использовать XMLConverter и конвертировать XML (я сделал некоторые изменения):

<?xml version="1.0" encoding="UTF-8"?> 
<books> 
    <book id="bk101"> 
    <title>XML Developer's Guide</title> 
    </book> 
    <book id="bk102"> 
    <title>Midnight Rain</title> 
    </book> 
</books> 

NSDictionary к, как показано ниже:

2013-12-24 13:15:48.167 test[603:70b] { 
    books =  { 
     book =   (
         { 
       "-id" = bk101; 
       title = "XML Developer's Guide"; 
      }, 
         { 
       "-id" = bk102; 
       title = "Midnight Rain"; 
      } 
     ); 
    }; 
} 

и работать с ним.

Смежные вопросы