Справка по iPhone XMLParser - PullRequest
       17

Справка по iPhone XMLParser

0 голосов
/ 19 апреля 2010

Мне нужно разобрать файл XML для моего приложения, и я не имею ни малейшего понятия, как это сделать. Я прошел один урок по XMLParser, и он работал нормально, но XML-файл в этом уроке был очень простым, а мой XML-файл немного более сложным.

Вот фрагмент XML-файла:

  <?xml version="1.0" encoding="UTF-8"?>
    <digital_tpp cycle="1003" from_edate="0901Z    03/11/10" to_edate="0901Z     04/08/10">
        <state_code ID="AK" state_fullname="Alaska">
            <city_name ID="ADAK ISLAND" volume="AK-1">
                <airport_name ID="ADAK" military="N" apt_ident="ADK" icao_ident="PADK" alnum="1244">
                    <record>
                        <chartseq>10100</chartseq>
                        <chart_code>MIN</chart_code>
                        <chart_name>TAKE-OFF MINIMUMS</chart_name>
                        <useraction></useraction>
                        <pdf_name>AKTO.PDF</pdf_name>
                        <cn_flg>N</cn_flg>
                        <cnsection></cnsection>
                        <cnpage></cnpage>
                        <bvsection>C</bvsection>
                        <bvpage></bvpage>
                        <procuid></procuid>
                        <two_colored>N</two_colored>
                        <civil> </civil>
                        <faanfd15></faanfd15>
                        <faanfd18></faanfd18>
                        <copter></copter>
                    </record>
                    <record>
                        <chartseq>10200</chartseq>
                        <chart_code>MIN</chart_code>
                        <chart_name>ALTERNATE MINIMUMS</chart_name>
                        <useraction></useraction>
                        <pdf_name>AKALT.PDF</pdf_name>
                        <cn_flg>N</cn_flg>
                        <cnsection></cnsection>
                        <cnpage></cnpage>
                        <bvsection>E</bvsection>
                        <bvpage></bvpage>
                        <procuid></procuid>
                        <two_colored>N</two_colored>
                        <civil> </civil>
                        <faanfd15></faanfd15>
                        <faanfd18></faanfd18>
                        <copter></copter>
                    </record>
                </airport_name>
            </city_name>
        </state_code>
    </digital_tpp>

Что мне нужно сделать, так это поискать в XML-файле <...icao_ident>, который указывает пользователь, затем создать словарь, содержащий <pdf_name> и <chart_name> для каждого <record>. Затем я создам пользовательский интерфейс, который отображает PDF-файлы.

Может кто-нибудь направить меня к хорошему учебнику или объяснению того, как работает XML-парсер? Или, если я поступлю неправильно, я тоже буду открыт для предложений.

(размер файла XML составляет около 8 МБ)

Ответы [ 4 ]

2 голосов
/ 19 апреля 2010

Вы можете обнаружить, что в моем блоге об упаковке NSXMLParser дает вам то, что вам нужно - и, возможно, альтернативу более высокого уровня (моя оболочка).

Например, используя мою технику, вы бы написали такие методы, как:

-(void) handleElement_chartname: (NSDictionary*) attributes;

1 голос
/ 21 апреля 2010

я знаю, что это не лучший способ ...

Я боролся в течение 2 дней, пытаясь адаптировать парсер XML к моей ситуации. Я не мог понять это, вероятно, потому что я так привык делать это в C #, и obj-c является новым для меня ...

Итак, то, что я сделал, было проанализировано как строка.

Я преобразовал весь XML-файл в NSString, затем использовал substringToIndex и substringFromIndex, чтобы выделить нужный мне раздел (аэропорт). Затем я использовал тег </record> для создания массива <records>, а затем написал цикл for, который брал нужные мне значения из каждого объекта массива, просто получая диапазон тегов.

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

NSString *path = [[NSBundle mainBundle] pathForResource:@"dttps" ofType:@"xml"];
NSData *data = [[NSData alloc]initWithContentsOfFile:path];
NSString *xmlString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

NSRange range = [xmlString rangeOfString:searchedAirport];
xmlString = [xmlString substringFromIndex:range.location];
range = [xmlString rangeOfString:@"/airport_name"];
xmlString = [xmlString substringToIndex:range.location];

NSMutableArray *chartNames = [[NSMutableArray alloc]initWithCapacity:100] ;
NSMutableArray *pdfNames = [[NSMutableArray alloc]initWithCapacity:100] ;
NSArray *charts = [xmlString componentsSeparatedByString:@"</record>"];

NSString *tempString = [[NSString alloc]initWithFormat:@""];

int chartsCount = [charts count]-1;

int x;
for (x=0; x < chartsCount; x=x+1) {

    tempString = [charts objectAtIndex:x];
    range = [tempString rangeOfString:@"<chart_name>"];

    tempString = [tempString substringFromIndex:range.location+12];
    range = [tempString rangeOfString:@"</chart_name>"];
    tempString = [tempString substringToIndex:range.location];

    [chartNames addObject:tempString];

    tempString = [charts objectAtIndex:x];
    range = [tempString rangeOfString:@"<pdf_name>"];
    tempString = [tempString substringFromIndex:range.location+10];
    range = [tempString rangeOfString:@"</pdf_name>"];
    tempString = [tempString substringToIndex:range.location-4];
    [pdfNames addObject:tempString];


}

с последующей очисткой ...

1 голос
/ 19 апреля 2010

Предлагаю вам прочитать Event-Driven XML Programming Guide для какао . В вашем конкретном случае вам нужно сделать следующее:

  • В parser: didStartElement: проверьте имя элемента: "airport_name", инициализируйте новый массив для хранения всех элементов записи (или вы можете определить собственную структуру данных для хранения элемента записи), словарь для хранения всех элемент в записи, одна строковая переменная для хранения текущего текста
  • В парсере: foundCharacters: добавить строку к текущему тексту
  • В парсере: didEndElement: сохранить словарь в массив, освободить массив, сохранить результаты.

ОБНОВЛЕНО

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {

    if ( [elementName isEqualToString:@"airport_name"]) {

        if (!airports)
            airports = [[NSMutableArray alloc] init];
        NSString *str_icao_ident = [attributeDict objectForKey:@"icao_ident"];
        //do something
        return;
    // ... continued ...
}}
0 голосов
/ 21 апреля 2010

Разбор XML по умолчанию на iPhone довольно трагичен по сравнению с современными языками сценариев. Если вы выполняете серьезный анализ сложных объектов с несколькими уровнями дочерних объектов, то Бог поможет вам с NSXMLParser.

Я бы порекомендовал проверить TouchXML, который предлагает гораздо более цивилизованное решение, которое ближе к тому, что вы можете увидеть на языке, таком как Python или Actionscript, с точки зрения его реализации в вашем собственном источнике.

...