пятница, сентября 08, 2006

Укрощаем XML - получаем соседский узел

Одним из преимуществ XML является представление информации с помощью родительско-дочерних отношений.Это облегчает парсинг и понимание структуры.Однако, есть некоторые XML форматы (такие как формат play-листа Apple), представляют информацию с помощью соседских отношений на одном уровне.

Например, одним способом представления пары имя / значение является следующая форма:

<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.

Оригинал поста

Комментариев нет: