Разбор XML-файла с NSXMLParser - получение значений - PullRequest
9 голосов
/ 21 мая 2011

У меня есть XML-файл, который содержит некоторые данные, которые я хотел бы использовать:

<?xml version="1.0" encoding="UTF-8" ?>

<items>
<item name="product" price="19.95" where="store">
This is the first product.
</item>

<item name="product2" price="39.95" where="online">
This is the second product.
</item>

<item name="product3" price="99.95" where="garagesale">
This is the third product.
</item>

</items>

Если бы я сделал 4 массива, один для имени, один для цены, другой для того, где он былкупил и один для его описания, как мне получить данные в массивы?

Я рассчитывал с помощью NSXMLParser, но не смог получить name, price, where или описание.

Я застрял на том, как это сделать.

Любая помощь приветствуется.

Ответы [ 4 ]

15 голосов
/ 21 мая 2011

Сначала вам нужно создать объект, который выполняет разбор. Он установит экземпляр NSXMLParser , установит себя в качестве делегата для анализатора и затем вызовет сообщение анализа. Он также может быть ответственным за хранение ваших четырех массивов результатов:

NSXMLParser * parser = [[NSXMLParser alloc] initWithData:_data];
[parser setDelegate:self];
BOOL result = [parser parse];

Сообщение, которое вас больше всего интересует в реализации ваших объектов-делегатов: didStartElement . Этот парень вызывается для каждого элемента в вашем XML-файле. В этом обратном вызове вы можете добавить свое имя, цену и атрибуты местоположения в соответствующие массивы.

- (void)parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qualifiedName
    attributes:(NSDictionary *)attributeDict
{
    // just do this for item elements
    if(![elementName isEqual:@"item"])
        return;

    // then you just need to grab each of your attributes
    NSString * name = [attributeDict objectForKey:@"name"];

    // ... get the other attributes

    // when we have our various attributes, you can add them to your arrays
    [m_NameArray addObject:name];

    // ... same for the other arrays
}
5 голосов
/ 26 мая 2013

Чтобы получить значение между тегами (например, «Это первый продукт».), Вы можете переопределить - (void) parser: (NSXMLParser *) parser foundCharacters: (NSString *) string

3 голосов
/ 21 мая 2011

в следующем методе

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

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

        NSString *name=[attributeDict objectForKey:@"name"];
        NSString *price=[attributeDict objectForKey:@"price"];
        NSString *where=[attributeDict objectForKey:@"where"];
    }
}
0 голосов
/ 21 мая 2011

Вы должны рассматривать словарь тега элемента как массив, а три тега (имя, цена и где) - как объект с индексом 0,1,2

.
...