2012-01-05 1 views
2

после HTTP Post я получить ответ XML как следующее:Получить значение ответа XML с GDataXML

<result value="OK"> 
    <user id="1"> 
      <name>admin</name> 
      <rank>0</rank> 
      <picture_count>0</picture_count> 
      <comment_count>0</comment_count> 
      <has_profile>1</has_profile> 
    </user> 
</result> 

я хотел бы, чтобы извлечь идентификатор пользователя, но я не знаю, как это сделать. Я пробовал с GDataXML Parser, потому что он уже интегрирован в мой проект, но Я не знаю, как получить значение внутри тега html.

Надеюсь, вы можете мне помочь. Если нет решения с XMLParser, вы бы рекомендовали регулярные выражения? В этом случае я был бы признателен за решение для выражения регулярных выражений, я не очень хорош в этом :)

Заранее спасибо.

+0

используйте атрибут для имени элемента элемента. Для получения дополнительной информации см. Эту ссылку [stackoverflow] (http://stackoverflow.com/questions/3028020/ask-for-an-example-code-for-parsing-xml-and-get-attributes-by-using-gdata- api) –

+0

Спасибо, но если я использую 'GDataXMLElement * elem = doc.rootElement; NSString * userID = [[elem attributeForName: @ "user id"] stringValue]; 'this возвращает null. – s4lfish

+0

'attributeForName: @" id "' правильно. Атрибутом является 'id', а не' user id'. Надеюсь, поможет. –

ответ

4

Это код, который я использую для извлечения пользовательского атрибута. Оно работает.

NSString* path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"xml"]; 

NSData *xmlData = [[NSMutableData alloc] initWithContentsOfFile:path]; 
NSError *error; 
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:xmlData 
                  options:0 error:&error]; 

NSArray *userElements = [doc.rootElement elementsForName:@"user"]; 

for (GDataXMLElement *userEl in userElements) { 

    // Attribute 
    NSString *attribute = [(GDataXMLElement *) [userEl attributeForName:@"id"] stringValue];   
    NSLog(@"attribute for user is %@", attribute); 

    // Name 
    NSArray *names = [userEl elementsForName:@"name"]; 
    if (names.count > 0) { 
     GDataXMLElement *name = (GDataXMLElement *) [names objectAtIndex:0]; 

     NSLog(@"name for user is %@", name.stringValue); 
    } 

    // Rank 
    NSArray *ranks = [userEl elementsForName:@"rank"]; 
    if (ranks.count > 0) { 
     GDataXMLElement *rank = (GDataXMLElement *) [ranks objectAtIndex:0]; 

     NSLog(@"rank for user is %@", rank.stringValue); 
    } 

    // Do the same for other tags...  
} 

[doc release]; 
[xmlData release]; 

Файл test.xml - это то же самое, что вы извлекаете из ответа xml. Поэтому вам нужно изменить вторую строку этого фрагмента кода. Возможно, вы можете позвонить по телефону initWithData метод класса NSData.

Этот код можно разместить в нужном месте. Возможно, вы можете создать другой класс, который работает как централизованный синтаксический анализатор. Надеюсь, что это помогает

EDIT

Поместите эти две строки перед тем для обучения.

NSString *valAttribute = [(GDataXMLElement *) [doc.rootElement attributeForName:@"value"] stringValue];   
NSLog(@"value attribute for result is %@", valAttribute); 

Объяснение довольно простое. С doc.rootElement вы извлекаете весь документ xml, от <result> до </result>

+0

Большое спасибо. Я не создал этот пользовательский массив с этими отдельными пользовательскими элементами. Этот код работает как шарм. – s4lfish

+0

Добро пожаловать. –

+0

Маленький вопрос: я пытаюсь получить значение результата, создав массив 'NSArray * resultElements = [doc.rootElement elementsForName: @" result "];' и затем тот же, что и get'attributeForName @ "значение" ' но массив равен null. – s4lfish