Как получить доступ к точно таким же элементам с помощью NSXMLParser

У меня есть файл XML, который мне нужно проанализировать. Вот он (обрезанный для ясности):

<rss version="2.0" xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
    <channel>
        <item>
        <title>Yahoo! Weather - Somecity</title>
        <yweather:astronomy sunrise="6:52 am" sunset="5:36 pm"/>
        <yweather:forecast day="Wed" date="16 Feb 2011" low="39" high="59" text="Mostly Sunny" code="34"/>
        <yweather:forecast day="Thu" date="17 Feb 2011" low="29" high="50" text="Mostly Sunny" code="34"/>
        </item>
    </channel>
</rss>

Проблема в том, как вы можете видеть, что есть два элемента yweather:forecast, и оба не имеют статического текста, который можно использовать для различения между ними. Любые идеи?


person sudo rm -rf    schedule 16.02.2011    source источник
comment
Я знаю, что есть похожие вопросы, но они немного отличаются друг от друга.   -  person sudo rm -rf    schedule 16.02.2011
comment
Можете ли вы сказать нам, в чем проблема? Если бы я разобрал это, у меня мог бы быть класс, представляющий узел прогноза, и просто построить их массив. Чтобы помочь вам, нам нужно знать, что не работает.   -  person MystikSpiral    schedule 16.02.2011
comment
@Mystik: я просто не знаю, как обращаться с двумя одинаковыми элементами. Мне нужно захватить элементы внутри каждого yweather:forecast и добавить их в отдельные массивы.   -  person sudo rm -rf    schedule 16.02.2011


Ответы (1)


О, в итоге оказалось довольно легко. Вот что я сделал:

if([elementName isEqualToString:@"yweather:forecast"]) {
    if (counter == 0) {
        TodaysHigh      = [attributeDict objectForKey:@"high"];
        TodaysLow       = [attributeDict objectForKey:@"low"];
        counter ++; //where counter is an instance variable
    }

    if (counter == 1) {
        TomorrowsLow            = [attributeDict objectForKey:@"low"];
        TomorrowsHigh           = [attributeDict objectForKey:@"high"];
        TomorrowsCondition      = [attributeDict objectForKey:@"text"];
        TomorrowsConditionCode  = [attributeDict objectForKey:@"code"];
    }
}

Кусок пирога, верно? :)

person sudo rm -rf    schedule 16.02.2011
comment
Я думаю, вам следует упаковать идею прогноза в объект прогноза. Это плохо избавляет от необходимости знать, что находится в каждом слоте счетчика. Затем вы можете обрабатывать переменное количество дней без изменения кода. - person MystikSpiral; 16.02.2011