Легко расширяемый анализатор Objective C XML? - PullRequest
1 голос
/ 10 октября 2010

Если бы я знал, как сформулировать это, я мог бы найти ответ в Google. Мне нужен анализатор XML, который я могу вызывать для других анализаторов XML.

Например:

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

Мне нужен парсер, который начнет синтаксический анализ Car, перейдет к Driver и передаст ALL из Driver отдельному классу парсера, затем продолжит работу с make и т. Д.

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

1 Ответ

4 голосов
/ 10 октября 2010

Если вы используете 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;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...