Опубликован: 07.11.2006 | Доступ: свободный | Студентов: 3397 / 338 | Оценка: 3.94 / 3.71 | Длительность: 37:11:00
Лекция 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.

Игорь Хан
Игорь Хан

у меня аналогичная ситуация. Однако, если взять пример из приложения (ball_motion_04_click for trial.fla) то след остается. при этом заметил, что в моем проекте в поле "One item in library" виден кружок, в то время как в приложенном примере такого кружка нет.

Вопрос знатокам, что не так?

Александр Коргапольцев
Александр Коргапольцев

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