При использовании XML данных в своих скриптах, будь то JavaScript или ActionScript, необходимо постоянно помнить о порядке получаемых данных. Это затрудняет модернизацию ранее написанных скриптов и изменение XML документа (добавление новых обьектов и изменение их порядка).
Намного более эффективно использовать массив, в которых изначально вносяться данные из XML документа, а сам XML объект удаляется из памяти. Это позволяет изменять порядок элементов в XML файле, а также упрощает модернизацию программы под новый объект XML.
Ниже приводится функция, написанная на ActionScript (Flash 7), которая позволяет обращаться к загруженному XML документу, используя обычный массив.
function varData(obj){
var result = new Array();
if (!obj.firstChild.nodeValue.length && obj.attributes.textType!="true"){
for (var i=0; i < obj.childNodes.length; i++){
var nodeNameTemp = obj.childNodes[i].nodeName;
if (result[nodeNameTemp]){
if (!result[nodeNameTemp][0]){
var nTemp=result[nodeNameTemp];
result[nodeNameTemp] = new Array();
result[nodeNameTemp][0]=nTemp;
}
result[nodeNameTemp][result[nodeNameTemp].length]=varData(obj.childNodes[i]);
} else result[nodeNameTemp]=varData(obj.childNodes[i]);
}
} else {
if (obj.attributes.textType!="true")
result["_content"]=obj.firstChild.toString();
else {
result["_content"]=obj.toString();
result["_content"]=result["_content"].substring(result["_content"].indexOf(">")+1,result["_content"].lastIndexOf("/>""< font>));
}
}
result["_attributes"]=obj.attributes;
return result;
}
Функция работает следующим образом: в нее поступает XML объект, находятся все потомки поступившего узла, и если такие найдены, то для каждого из них функция вызывается снова. Если же потомков нет, то читаются данные этого узла и заносятся в массив. Причем для каждого узла выбираются и его атрибуты.
Формат полученного массива следующий:
- Для содержимого - корень[“узел1”][“узел2”][“_content”] (если узел2 – единственный потомок у узла1)
- корень[“узел1”][“узел2”][индекс][“_content”] (если узлов2 несколько, индекс начинается с нуля)
- Для атрибутов - корень[“узел1”][“узел2”][“_attributes”][“имя атрибута”]
В ActionScript к массиву можно обращаться и опуская [], т.е корень.узел1.узел2._content или корень.узел1.узел2._attributes.имя_атрибута (подробнее об этом в мануал по ActionScript)
Таким образом для загрузки XML документа нужно написать следующий код:
function parseXML(){
arrXML = varData(this.firstChild);
delete data_xml;
//дальше действия над данными или переход на другие фреймы
}
System.useCodepage = true; //(если используете кириллицу)
data_xml = new XML();
data_xml.ignoreWhite = true;
data_xml.onLoad = parseXML;
data_xml.load(“путь к xml файлу”);
Обратиться к элементам массива можно будет так: arrXML.node.node[0]._content и arrXML.node.node[0]._attributes.attribute
Важной возможностью функции является то, что узлы отмеченные атрибутом textType="true" не будут обрабатываться как XML данные, а будут представлены как текст. Это дает возможность использовать HTML теги в XML узлах и их последующее применение, например, в textHtml.