Разбор XML с помощью NSXMLParser - PullRequest
0 голосов
/ 19 марта 2011

Я пытаюсь проанализировать XML-файл, используя NSXMLParser.My NSXMLParserDelegate реализует parser:didStartElement и parser:didEndElement и получает сообщения от анализатора для каждого элемента.Но когда я пытаюсь распечатать их, я обнаруживаю, что сообщения пусты.Чего мне не хватает?

Мой делегат:

@interface ExtensionXML : NSObject <NSXMLParserDelegate> {
    @private NSXMLParser* xmlParser;
    @private NSURL*       fileUrl;
}
- (void) parse;           
- (ExtensionXML*) initWithPath: (NSString*)path;
@end

@implementation ExtensionXML
- (ExtensionXML*) initWithPath: (NSString*)path
{
     if (self = [super init])
     {
         fileUrl = [NSURL fileURLWithPath:[path  stringByExpandingTildeInPath]]; // error handling
     }
    return self;
}

- (void) parse
{
   xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:fileUrl];
   [xmlParser setDelegate:self];
   [xmlParser setShouldResolveExternalEntities:YES];
   [xmlParser setShouldProcessNamespaces:YES];
   [xmlParser setShouldReportNamespacePrefixes:YES];
   [xmlParser parse];
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
{
    NSLog(@"start: element %s uri %s qualified name %s", elementName, namespaceURI, qualifiedName);
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
{
    NSLog(@"end: element %s uri %s qualified name %s", elementName, namespaceURI, qualifiedName);
}
@end 

Файл xml:

<someroot xmlns="http://ns.mycompany.com/product/format/1.3">
    <id>myid</id>
    <version>1</version>
    <components>
        <component name="componentOne">
                <initializer>Init0</initializer>
        </component>
    </components>
</someroot>

Выходные данные NSLog показывают, что elementName, namespaceURI и qualizesNameвсе пустые.

Ответы [ 2 ]

0 голосов
/ 29 января 2013
Try to compare with element name and get the results like the following

if([elementName isEqualToString:@"component"])
{
 //print something related to xml data
}

Use %@ instead of %s for printing.
0 голосов
/ 19 марта 2011

Для записи строк NSS используйте %@ вместо %s.Измените обе строки NSLog.См. Спецификаторы формата строки для получения списка спецификаторов с их использованием.

Другая проблема заключается в том, что метод делегата didEndElement не имеет параметра атрибутов, поэтому написанный вами метод не будет вызываться,Должно быть:

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
    qualifiedName:(NSString *)qualifiedName
{
    NSLog(@"end: element %@ uri %@ qualified name %@", 
                elementName, namespaceURI, qualifiedName);
}
...