2010-10-10 3 views
1

Если бы я знал, как это сделать, я мог бы найти ответ на Google. Мне нужен парсер XML, с которым я могу обратиться к другим синтаксическим анализаторам XML.Легко расширяемый объектный анализатор XML C?

Например:

<car> 
    <driver> 
     <name /> 
     <age /> 
     <height /> 
    </driver> 
    <make> 
     <name /> 
     <nationality /> 
     <age /> 
    </make> 
    <engine> 
     <horsepower /> 
     <displacement /> 
     <mileage /> 
    </engine> 
</car> 

мне нужна анализатор, который начнет разбор автомобиля, чтобы получить драйвер и дать ВСЕ драйвера для отдельного класса анализатора, а затем продолжить с макияжем и т.д.

Если вы думаете об этом как о машине состояния, мне нужен парсер, где некоторые состояния могут быть разными классами.

+0

Нужно ли работать на iOS? или OS X? – Thilo

+0

iOS. В настоящее время используется NSXMLParser. –

ответ

4

Если вы используете NSXMLParser вы можете переключить делегата, когда вы нашли элемент:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { 
    if ([elementName isEqualToString:@"driver"]) { 
    parser.delegate = driverDelegate; 
    driverDelegate.parentDelegate = self; 
    // Maybe call [driverDelegate parser:didStartElement:...] 
    } 
} 

, а затем изменить его обратно, когда вы закончите с другой делегат (в классе driverDeleagate в):

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
    if ([elementName isEqualToString:@"driver"]) { 
    parser.delegate = parentDelegate; 
    } 
} 
+0

Это именно то, что я хотел сделать. Благодарю. –

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