Например, одним способом представления пары имя / значение является следующая форма:
<Artist>Interpol</Artist>
А формат Apple делает это с помощью структуры ключ / значение:
<key>Artist</key><string>Interpol</string>
отношения между ключом и значением основываются на соседстве, а не на иерархии, как в первом примере. Я не буду вникать, зачем Apple это делает (я и не знаю), хорошо это или плохо, но это, однозначно, доставляет трудности при парсинге.
Чтобы распарсить эту строку, необходимо сперва извлечь узел key, соответствующий нужному значению, а затем получить следующий узел, содержащий это значение.
Вот пример:
package {
import flash.display.Sprite;
public class XMLTest extends Sprite
{
public function XMLTest()
{
var xml:XML =
<xml>
<songs>
<song>
<key>Artist</key><string>Interpol</string>
<key>Track Number</key><int>7</int>
</song>
<song>
<key>Artist</key><string>Bloc Party</string>
<key>Track Number</key><int>3</int>
</song>
</songs>
</xml>
var temp:XML;
var artistName:String;
//проходим через songs
for each (var song:XML in xml.songs.song)
{
// получаем узел key, имеющий значение Artist,
// в первой song
temp = song.key.(text() == "Artist")[0];
//получаем следующий узел
//(т.е. соседский узел узла key).
//Сохраняем его как Stirng
artistName =
String(temp.parent().children()[temp.childIndex() + 1]);
trace(artistName);
}
}
}
}
Важной частью примера является строка:
temp.parent().children()[temp.childIndex() + 1]
Здесь извлекается соседский узел узла temp. Для получения предыдущего узла, вычтите 1:
temp.parent().children()[temp.childIndex() - 1]
Данный метод добавлен Майком Чамберсом в класс XMLUtil в corelib.
Оригинал поста
Комментариев нет:
Отправить комментарий