iOS разбирает целые элементы XML - PullRequest
0 голосов
/ 07 марта 2012

Я знаю, что на вопросы об XML здесь отвечали миллион раз, но я не смог найти ответ, который мне подходит.Вот моя проблема, и любая помощь приветствуется!

После прочтения XML-файла из php-скрипта на моем сервере и отправки его на NSXMLParser я не могу найти способ получить все элементы с именем "name" вэтот XML для заполнения UITableView позже в моем приложении.Моя цель - прочитать весь XML-файл, получить все элементы с именем «name» и сохранить их в NSMutableArray для заполнения табличного представления.

Итак, вот код XML, переданный в NSXMLParser путем вызоваPHP-скрипт:

<?xml version="1.0" encoding="ISO-8859-1"?><?xml-stylesheet type="text/xsl" href="auctions_xsl.xsl"?><auctions>
<auction>
    <id>1</id>
    <name>Leilão Tijuca</name>
    <description>Casa de vila, ótimo estado e ótima localização. Leiloeiro responsável: Fulano de Tal. Contato pelo telefone 3554-5555</description>
    <date>2012-03-06</date>
    <imagepath1>imagem 1</imagepath1>
    <imagepath2>imagem 2</imagepath2>
    <imagepath3>imagem 3</imagepath3>
    <location>Rua São Francisco Xavier, 390 - Tijuca - Rio de Janeiro - RJ</title>
</auction>
<auction>
    <id>2</id>
    <name>Leilão Barra</name>
    <description>Cobertura ótimo estado. Leiloeiro responsável Leandro. Contato pelo tel: 3554-9356</description>
    <date>2012-03-28</date>
    <imagepath1>001</imagepath1>
    <imagepath2>002</imagepath2>
    <imagepath3>003</imagepath3>
    <location>Avenida das Américas, 500 - Barra - Rio de Janeiro - RJ</title>
</auction>
<auction>
    <id>3</id>
    <name>Leilão Flamengo</name>
    <description>Apartamento andar baixo. Localizado em frente ao metrô. Leiloeiro Marcel pelo tel 3554-6678</description>
    <date>2012-03-18</date>
    <imagepath1>im1</imagepath1>
    <imagepath2>im2</imagepath2>
    <imagepath3>im3</imagepath3>
    <location>Avenida Oswaldo Cruz, 110 - Flamengo - Rio de Janeiro - RJ</title>
</auction>

А вот часть моего кода объективного c: (прокомментированы неправильные части)

-(void)viewDidLoad {

[super viewDidLoad];
NSURL *url = [NSURL URLWithString:@"http://leandroprellapps.capnix.com/script.php"];
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];
allNames = [NSMutableArray arrayWithObjects: nil]; //declared as instance variable in .h file
xmlParser.delegate = self;
[xmlParser parse];
NSLog(@"%@",allNames); //getting wrong data here
}

//and later on

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

// SUPPOSE TO READ ALL XML FILE AND FIND ALL "name" ELEMENTS
if ([elementName isEqualToString:@"name"]) {

    self.currentName = [[NSMutableString alloc] init];       
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

[self.currentName appendString:string]; //passing the value of the current elemtn to the string
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

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

    NSLog(@"%@", currentName); //show current element
    [allNames addObject:currentName];//not only is not reading all xml "name" elements but also adding another elements not shown in above NSLog....        
    }
}

В качестве примера, вот мойNSLog результаты:

2012-03-06 22:51:37.622 Leilao Invest 2.0[10032:f803] Leilão Tijuca

2012-03-06 22:51:37.623 Leilao Invest 2.0[10032:f803] (
"Leil\U00e3o Tijuca\n\t\tCasa de vila, \U00f3timo estado e \U00f3tima localiza\U00e7\U00e3o. Leiloeiro respons\U00e1vel: Fulano de Tal. Contato pelo telefone 3554-5555\n\t\t2012-03-06\n\t\timagem 1\n\t\timagem 2\n\t\timagem 3\n\t\tRua S\U00e3o Francisco Xavier, 390 - Tijuca - Rio de Janeiro - RJ"

)

Обратите внимание, что первый NSLog показывает правильное имя текущего элемента, но во втором NSLog, после добавления текущего элемента сделайте мой MutableArray, он показывает только первый элемент с именем «name» и кучу других элементов, которые не должны были быть добавлены, и не сохранял кодировку (NSISOLating1) строк.

1 Ответ

1 голос
/ 07 марта 2012

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

В вашем случае ваш первый тег - это 'id', так как он не совпадает с именем, ваше currentName не имеетinitialized и, следовательно, foundCharacters не добавляет значение '2', поскольку currentName в данный момент равно nil.Затем второй тег - это имя, поэтому он соответствует вашему состоянию и инициализирует строку.С этого момента все символы, найденные между тегами, будут добавляться к currentName.

Если вы хотите проанализировать только имя, один из способов - проверить, является ли текущий тег «name», прежде чем добавлять символы в currentName.

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

    // SUPPOSE TO READ ALL XML FILE AND FIND ALL "name" ELEMENTS
    if ([elementName isEqualToString:@"name"]) {
        isNameTag = YES;
        self.currentName = [[NSMutableString alloc] init];       
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    if (isNameTag) {
        [self.currentName appendString:string]; //passing the value of the current elemtn to the string
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

    if ([elementName isEqualToString:@"name"]) {
        isNameTag = NO;  // disable the flag
        NSLog(@"%@", currentName); //show current element
        [allNames addObject:currentName];//not only is not reading all xml "name" elements but also adding another elements not shown in above NSLog....        
    }
}
...