Опубликован: 07.11.2006 | Уровень: специалист | Доступ: свободно
Лекция 18:

XML

Доступ к XML из Flash

Вы, вероятно, захотите воспользоваться файлом XML для фильма Flash. Сначала нужно создать объект, который будет содержать этот файл и осуществлять доступ к нему. Скорее всего вам потребуется, чтобы программа-считыватель игнорировала любые дополнительные отступы, имеющиеся в файле.

//create the object 
var myXML = new XML();

//ignore white space 
myXML.ignoreWhite = true;

Так как загрузка XML-файла может занять некоторое время, Flash позволяет нам перезаписывать управляющий элемент события, сообщающий о полной загрузке файла XML. Очень часто для нашего фильма имеет смысл находиться в состоянии ожидания во время загрузки файла. Возможно, что способом, с помощью которого мы реализуем поддержку завершения загрузки, является переход к другому кадру и продолжение воспроизведения фильма. В некоторых случаях в нашем файле XML будут присутствовать какие-либо ошибки, и обработчик будет получать ошибку, с которой нам предстоит иметь дело.

myXML.ignoreWhite = true; 
myXML.onLoad = function(success) { 
  if (success) {
    gotoAndPlay("someFrame");
  } else {
    trace("failure loading xml file");
  }
};

Последним шагом расположения файла XML в фильме Flash является его непосредственная загрузка. Мы выполняем этот шаг в последнюю очередь, чтобы обеспечить поддержку файла объектом перед его непосредственным запросом.

//load the file
myXML.load("someFile.xml");

Когда у нас будет вся необходимая информация, понадобится получить к ней доступ. Из любого узла объекта XML следующие десять свойств могут иметь доступ к любой части информации в документе:

  • childNodes используется для поиска массива вложенных узлов.
  • Attributes указывает на объект, содержащий параметры узла.
  • nextSibling используется для нахождения следующего узла в массиве.
  • previousSibling используется для нахождения предыдущего узла в массиве.
  • parentNode используется для продвижения вверх по иерархии.
  • lastChild указывает на последний узел массива childNodes.
  • firstChild указывает на первый узел массива childNodes.
  • nodeName сообщает имя узла, например, "message" или "NAVIGATION".
  • nodeType сообщает о том, является узел элементом разметки или текстом.
  • nodeValue сообщает, каким является текст в случае текстового элемента.

Важно знать, с какого места вы начинаете. Объект XML на самом деле представляет весь документ, что означает, что корневой узел любого файла будет непосредственно представлен в виде дочернего узла объекта XML. Так как у документа XML должен быть один и только один корневой узел, то его очень просто выяснить. Следующие три выражения находят корневой узел XML-объекта myXML.

var rootNode = myXML.firstChild; 
var rootNode = myXML.lastChild; 
var rootNode = myXML.childNodes[0];

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

//this line of code is difficult to understand
someTextField = myXML.firstNode.childNodes[i].firstChild.nodeValue;

//while these are clearer
var rootNode = myXML.firstNode;
var messageArray = rootNode.childNodes;
var messageNode = messageArray [i];
var textNode = messageNode.firstChild;
someTextField = textNode.nodeValue;

Обновляемая отмеченная область: возврат

XML весьма удобен для чтения. Вспомните следующую строку из "Интеграция динамических данных" , когда вы в первый раз создали отмеченную область (файл message3.txt в папке лекции 15 на компакт-диске).

message1=Sales+hit+3+million&message2=New+product+launch+delayed&
Кmessage3=New+positions+available&message4=Finance+Director+retires&
Кmessage5=New+catalogue+out+next+month

Возьмем такую же отмеченную область и изменим ее, получая данные не из message3.txt, а из message3.xml.

<messagelist>
  <message> Sales hit 3 million </message> 
  <message> New product launch delayed </message> 
  <message> New positions available </message>
  <message> Finance Director retires </message> 
  <message> New catalogue out next month </message> 
</messagelist>

Это намного компактнее и легче для организации.

  1. Откройте файл dynamicText4.fla, использованный нами в "Интеграция динамических данных" , и сохраните его заново под именем marquee_revisited.fla. Откройте действия в кадре 1 главной временной шкалы и отредактируйте messageURL для указания на message3.xml (все эти файлы находятся на компакт-диске в папке этой лекции).
    // the location of our XML file var messageURL = "messages.xml";
  2. Измените counter так, чтобы начальным значением был 0. Это нужно для того, что бы использовать массив, первым элементом которого является число 0.
    // the index of the message node that we will display 
       var counter = 0;
  3. Измените myVars_obj с объекта loadVars на объект XML.
    // the Flash representation of our XML document 
      var myVars_obj = new XML();
  4. Добавьте строку, сообщающую считывателю XML о необходимости игнорировать любые отступы.
    //ignore the spaces we added to make the file human-readable 
    myVars_obj.ignoreWhite = true;
  5. Оставьте без изменений остальной код в первом кадре.
    myVars_obj.onLoad = function() { 
      gotoAndPlay("offscreen");
    };
    
    myVars_obj.load(messageURL); 
    stop();
  6. Теперь перейдите в кадр 2 слоя actions и удалите весь имеющийся код. Затем создайте переменную для корневого узла нашего документа, после чего создайте другую переменную, в которой будут содержаться дочерние узлы корня.
    //the root node is the messagelist node. It will be the first 
    К// (and only) node in the XML document
    var rootNode = myVars_obj.firstChild;
    
    //the nodes that we are interested in are the children of the root 
    К//node. This is the array that holds all the message nodes. 
    var messageArray = rootNode.childNodes;
  7. Введите следующий код для того, чтобы counter содержал номер одного из наших узлов сообщений. Если счетчик вышел за пределы допустимого, установите его обратно на значение 0.
    //if we've gone through all of our messages then start over 
    if (counter>=messageArray.length) {
        counter = 0; 
    }
  8. Создайте переменную, в которой будет содержаться сам узел сообщения.
    //get the current message node from the array of message nodes 
    var messageNode = messageArray[counter];
  9. Вспомните, что любой текст, не являющийся узлом элемента в документе XML, является текстовым узлом. Используйте следующий код для получения текстового узла из узла сообщения.
    //get the text node in the current message node 
    var textNode = messageNode.firstChild;
  10. Ниже приведен последний фрагмент кода. Установите сообщение на текст внутри текстового узла.
    //set the marquee to the value of the text node in the current
    //message node.
    message = textNode.nodeValue;
  11. Наконец, убедитесь, что message3.xml (на компакт-диске) находится в той же директории на вашем жестком диске, что и файл marquee_revisited.fla, и запустите фильм.

    Все остальные изменения проводить необязательно. Все будет работать точно так же, как и в упражнении "Интеграция динамических данных" - динамический текст будет "скользить" из правой части экрана. Разница здесь заключается в использованном источнике информации.

    Теперь рассмотрим более сложный материал, прибегнув на этот раз к помощи PHP.

Игорь Хан
Игорь Хан
След не остается
Александр Коргапольцев
Александр Коргапольцев
Вопрос по содержанию лекции №2, курс Flash MX Studio
Евгения Новоселецкая
Евгения Новоселецкая
Россия
Станислав Бакулин
Станислав Бакулин
Эстония, Нарва