Просмотр полной версии : парсинг xml :D
Есть XML такого вида:
<?xml version="1.0" encoding="utf-8" ?>
<Config>
<Head>Основной текст</Head>
<TableHeadline>
<Name>имя</Name>
<Info>инфо</Info>
</TableHeadline>
<Objects>
<Item>
<Name>имя1</Name>
<Info>инфо1</Info>
</Item>
<Item>
<Name>имя2</Name>
<Info>инфо2</Info>
</Item>
</Objects>
</Config>
Можете привести пример парсинга дочерних узлов. Прочитал только что статью Дембицкого, но на практике пока ничего не получилось, в поиске нашел примеры с братскими узлами и то кривовато оформленными, может я плохо ищу? :boredom:
Парсинг ... что именно вы хотите?
получить все значения айтимов name и info во flash.
var xml:XML = new XML ('<?xml version="1.0" encoding="utf-8" ?><Config> <Head>Основной текст</Head><TableHeadline><Name>имя</Name><Info>инфо</Info></TableHeadline><Objects><Item><Name>имя1</Name><Info>инфо1</Info></Item><Item><Name>имя2</Name><Info>инфо2</Info></Item></Objects></Config>');
xml.ignoreWhite = true;
function parse (node:XMLNode) {
var name:String = node.nodeName.toLowerCase ();
if (name == "name" || name == "info") {
trace (node.nodeName + ":" + node.firstChild.nodeValue);
}
if (node.hasChildNodes () || node.childNodes.length != 0) {
var j:Number = 0;
while (node.childNodes[j]) {
parse (node.childNodes[j++]);
}
}
}
parse (xml);
у меня уже голова кругом идет от этого парсинга. Нигде толком ниче не могу найти. Итого имеется загружаемый descr.xml:
<?xml version="1.0" encoding="unicode"?>
<gallery>
<picture file="001_SummerCamp2006/P1010801.JPG" name="1"/>
<picture file="001_SummerCamp2006/P1010804.JPG" name="2"/>
<picture file="001_SummerCamp2006/P1010823.JPG" name="3"/>
<picture file="001_SummerCamp2006/P1010860.JPG" name="4"/>
<picture file="001_SummerCamp2006/P1010876.JPG" name="5"/>
</gallery>
мне нужно в поле Display динамического текста вывести name, тоесть описание файла. Если можно - короткий алгоритм всей этой процедуры вывода нужной информации, а то в голове просто не могу связать все воедино.
Начало такое:
myXML = new XML();
myXML.ignoreWhite = true;
myXML.load("descr.xml");
Что конкретно делает функция parseXML если на пальцах разьяснить??
Вот вам решение для вашего конфига, если поля находятся на _root и именуются Display1, Display2 ... :
var xmlData:XML = new XML();
xmlData.ignoreWhite = true;
xmlData.onLoad = loadXML;
xmlData.load('descr.xml');
function loadXML (success:Boolean)
{
if (success)
{
var node:XMLNode = this.firstChild ;
var total:Number = node.childNodes.length ;
for( i = 0; i < total; i++)
{
var fName:String = node.childNodes[i].attributes['name'];
trace(fName); //выведет 1, 2, 3, 4, 5
_root['Display' + i].text = fName;
}
}
}
Спасибо за пример. Вроде все понял. Только вот матчасть у меня хромает.
Вычитал насчет XML.onLoad() : К моменту вызова события onLoad полученные данные уже разобраны методом parseXML и помещены в тело экземпляра XML. Тоесть походу parseXML автоматом парсит файл?? Не нужно его вызывать потом нигде?? И в какой момент именно вызывается этот parseXML?? В момент вызова load?
И еще вопрос походу матчасти. Почему вызов функции loadXML идет раньше ее объявления??
Я просто пробую создать свою первую галерею на сайте без слайдшоу. Есть контейнер, с двумя кнопками (вперед, назад) и текстовое поле для вывода информации и фото (Display). Сейчас уже все работает, только не мог вывести описание файла.
По поводу второго - вызов функции не идет раньше ее определения.
Все действия кода идут последовательно, все функции к тому времени уже определены (которые записаны так, как в моем примере). Просто для удобства я обычно все функции записываю внизу.
А насчет метода parseXML - я им не пользуюсь, точно не скажу. Насколько я понимаю, метод предназначен для превращения строки в объект XML.
И еще. Вот цитата из переведенного хелпа по AS2:
XML.onLoad
...
Обработчик события; вызывается Flash Player, когда XML документ получен с сервера.
У меня стоит задача вывести описание файла name на изображение, загружаемое по пути file, взятому из загруженного файла xml при запуске флэша. А также при каждом переходе к следующей/предыдущей фотографии.
Завтра с утра со свежей головой попробую через ваш пример сделать требуемое...
Совет. Заносите при парсинге полученные данные в заранее объявленный массив (или массивы), чтобы потом можно из было оттуда брать при смене слайда.
Спасибо. С массивами работает все как надо, только при первой загрузке картинки в поле display отображается undefined. Никак не могу понять в каком порядке исполняется код?? Привык что сверху вниз, а тут не поймешь.
Еще вопрос насчет кодировки в XML. Как заставить флэш нормально работать с кириллицей? У меня элемент name в кириллице записан. При выводе получаются квадратики. Где-то читал, что в XML-файле для кириллицы нужно указывать кодировку юникод. Пробовал - не помогает.
I. Насчет undefined. Видимо вам надо увязать момент отображения первой картинки с моментом загрузки и разбора конфига. То есть отображать слайд и когда конфиг уже распарсен и когда картинка уже загрузилась.
Я обычно пишу прелоадер, который загружает конфиг и все картинки (отрисовываю их в битмапу и кладу в массив). Конечно, сперва идет загрузка конфига, чтобы получить пути для загрузки картинок, потом гружу их с помощью MovieClipLoader.
Также этот прелоадер у меня обычно следит за загрузкой всей флешки.
Когда готово всё, перехожу к кадру с основным содержанием флешки.
II. Насчет кодировки. Вообще-то флеш работает с UTF-8.
Общие рекомендации для нормальной работы с кириллицей:
1. Сохраните XML в UTF-8.
Одной записи <?xml version="1.0" encoding="UTF-8"?> в начале файла будет недостаточно. Нужно именно сохранить файл в кодировке UTF-8. Т.е. выбрать utf-8 при сохранении из текстового редактора (я, например, использую Notepad++, хотя и обычный Notepad умеет это делать).
2. Для нормального отображения в текстовых полях кириллицы часто нужно бывает внедрить шрифт.
Как внедрять шрифт, на форуме неоднократно говорилось.
Чтобы проверить, что у вас за проблема, локализуйте ее.
Например, потрейсите внутри парсера (в данном случае парсером я называю разбор данных внутри обработчика onLoad) получаемые из файла данные. Если трейс показывает нормальный кириллический текст, а в поле он не отображается, или отображается неправильно, то проблема уже не в работе с XML, а в отображении кириллицы в поле, внедрение шрифта должно помочь.
Ни в коем случае не используйте назначение свойства System.useCodepage = true.
Если уж совсем будут проблемы, стучитесь.
Еще раз спасибо. Действительно, мой редактор плохо сохранял в кодировке UTF-8, хотя в опциях было выставлено. Проблема с кодировкой решена.
Насчет undefined - запихнул строку отображения первого описания в саму функцию loadXML. Только вот не совсем понимаю последовательности исполнения кода программы. Стояла эта строчка вне, то есть после функции loadXML - было undefined. Тоесть, получается что сначала инициализируются/объявляются все пользовательские функции в программе, а потом уж начинается исполнение кода сверху вниз?? Или как?? В других языках программирования все на порядок в этом плане понятнее.
Описание первой картинки подтягивается из первого элемента массива, который заполняется в теле функции loadXML.
regman, все просто! Вы поступили верно.
Дело в том, что код AS работает асинхронно. Флеш - это в первую очередь интернет-технология и нуждается в учете полной загрузки чего-либо, того же динамического контента.
Код AS будет исполняться сам по себе мгновенно, строка за строкой, невзирая на то, что что-то не успело загрузиться, если не принять мер. А вдруг скорость соединения с файлом 1 байт /с ? Тогда данные о подписях будут получены очень не скоро.
А код последовательно выполнится практически мгновенно. И что-то может окажется undefined.
Поэтому и введены обработчики событий. То есть все, что нуждается в данных из конфига, нужно начинать выполнять изнутри onLoad. Необязательно пихать туда весь код. А просто например, создать функцию инициализации, которую и вызывать изнутри onLoad, выполняя ею начальные действия. Ведь они-то хоть и начальные, но уже требуют загруженных данных.
Те же картинки нужно грузить с помощью MovieClipLoader (есть событие onLoadInit), данные из файлов - класс LoadVars (события onLoad или onData).
Это нужно для того, чтобы знать, когда можно приступать к действиям над загруженным контентом или использовать конфигурационные данные.
Так что и тут все понятно. :)
Спасибо. Теперь все более прозрачно :)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.