понедельник, 8 июня 2009 г.

Flex & xml

Был у меня раньше xml-документ, информацию из которого нужно было нужно было использовать в моём приложении. Необходимый функционал был написан, и спокойно работал, никому не мешая. Тут понадобилось добавить дополнительные функции обработки документа с новыми тегами. Например,


<doc>
<pg>
<ln>
<tag t="1" />
<tag t="2" />
<tag t="3" />
</ln>
</pg>
</doc>


Потребовалось ввести обработку нового тега

<doc>
<pg>
<mytag t="5" n="2" />
<ln>
<tag t="1" />
<tag t="2" />
<tag t="3" />
</ln>
</pg>
</doc>

Но не получалось это сделать просто и замечательно. Дело в том, что данные документа, как и сам документ использовались в нескольких местах приложения, причём обработка была жёстко привязана ко времени (синхронизация со звуковым потоком). Новый тег также должен был обрабатываться в соответствии со своим временем. На ум сразу пришла идея создать несколько костылей, гляди и заработало бы... может быть.

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


// заменить теги count на соответствующие теги ln
for (var tagCount: int = 0; tagCount < xmlText.child("pg").length(); ++tagCount) {
if (xmlText.child("pg")[tagCount].child("count").length() == 0) {
continue; // ежели тут нет тега с обратным отсчётом, то идём к следующей итерации
}

var n: int = int(parseFloat(xmlText.child("pg")[tagCount].child("count")[0].@n));
var t: int = int(parseFloat(xmlText.child("pg")[tagCount].child("count")[0].@t));


var lnXml: String = "<ln>\n";

for (var i: int = 0; i < n; ++i) {
lnXml += '<tag t="' + (t + i).toString() + '" />\n';
}
lnXml += "</ln>\n";

xmlText.child("pg")[tagCount].replace("count", lnXml); // заменить старый тег новым
}

В результате получил такой документ

<doc>
<pg>
<ln>
<tag t="1" />
<tag t="2" />
<tag t="3" />
</ln>
<ln>
<tag t="5" />
<tag t="6" />
</ln>

</pg>
</doc>


Заодно научился заменять элементы в xml-документе на Flex'е.

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

Отправить комментарий