PDA

Просмотр полной версии : Анализ элементов XML, структура которого неизвестна.


Torero
27.06.2007, 19:19
Добрый день. Начал изучать работу с XML и нарвался на проблемку..
Допустим, есть XML-объект
xm=new XML("<u><t><d><bi h='12'>Some Text</bi></d><bi h='16'>Some Text</bi></t></u>")
и я хочу заменить <bi h='xx'></bi> на <font size='xx'><b><i> </b></i></font>.
Относительно использования insertBefore, insertAfter, attributes, вопросов, вроде-бы, нет, но как перебрать элементы XML не зная его структуры?

BigDan
27.06.2007, 19:27
while+XML.hasChildNodes()+XML.childNodes

Kikasso
27.06.2007, 19:49
+ рекурсия

Torero
28.06.2007, 01:33
Пипл, хелп - не получается. Кучу вариантов перебрал.
Самый жизнесособный:
В цикле спуститься на нижний уровень каждой ветви (.hasChildNodes=false), поштучно скопировать объекты с нижнего уровня + их родителя в другой XML, попутно их проанализировав, вернуться в цикле на предыдущий уровень. Цикл заканчивался-бы после того, как все элементы XML перекочевали в другой.
В чем запарка: есть appendChild, но не нашел ничего наподобие appendParent - не получается копировать элементы, начиная с нижних уровней.
В чем вопрос: как в XML добавить родительский элемент? Если никак, то вокруг чего зацикливать? - у нас нет даже общего количества элементов.

Люди, оч.прошу, помогите пожалуйста найти ошибку - уже 3 часа парюсь...((((

private function test():Void{
var s:String; var aNode:XMLNode;
var i:Number; i=0;
var k:Boolean; k=false;
s="<person><name>Dmitry<initials>D.</initials><length>6</length></name><age>24<birthday>1.01.2000</birthday></age></person>";
s+="<password><val>asdf</val><expire>12.07.2007</expire></password>";
s+="<mood><average>good</average><now>so-so</now></mood>"; //!!!!!!!!!!!!!!!!!!!! :(
xm_new=new XML(); xm=new XML(s);
xm_new=xm; aNode=xm.childNodes[0];
while(xm.childNodes.length>0){
k=false; i=0;
while (k<>true){ //проверяем все элементы
if(aNode.childNodes[i].hasChildNodes()){//на наличие следующего уровня
aNode=aNode.childNodes[i]; // и переходим к нему..
i=-1;
}
i++;
if (i>aNode.childNodes.length-1){k=true;}
}
//спустившись на нижний уровень ветки, выдергиваю все элементы и обнуляю их.
aNode=aNode.parentNode;
for (var i:Number =0; i<aNode.childNodes.length; i++){
if (aNode.childNodes[i].nodeName<>null){
trace(aNode.childNodes[i]+"+"+aNode.childNodes[i].nodeName);
aNode.childNodes[i].removeNode();
}
}
}
}

Данный код раскладывает почти весь XML на элементы. Проблема в "почти". Восклицательными знаками выделил проблемный участок.

Kikasso
28.06.2007, 22:48
и я хочу заменить <bi h='xx'></bi> на <font size='xx'><b><i> </b></i></font>.
А зачем вообще заменять? Не проще bi в css описать?

Torero
29.06.2007, 08:04
Смог разложить XML.

А насчет css:
знаком я с ним поверхностно. "<bi>TEXT</bi>" сделать равным "<b><i>TEXT</b></i>" - не проблема.
1.но как выдернуть из тэга аттрибут?
напр: как "<bi h='20'>TEXT</bi>" сделать равным "<font size='20'><b><i>TEXT</b></i></font>" ??
2.можно-ли средствами css указать на необходимость вставить текст? напр.если я хочу чтобы перед каждым элементом, заключенным в тэги <b></b> появлялось слово "жирным:". т.е. <b>TEXT</b> при выводе на экран выглядел следующим образом: "жирным:TEXT"

Kikasso
29.06.2007, 10:58
Torero, не знаю как в нормальном, во флешовом css нельзя конечно.
С аттрибутом: можно подумать, сколько размеров peально будет востребовано и столько наделать тегов ( bi16, bi20 например ).
Хотя разложить xml - хорошее упражнение в любом случае.

Torero
29.06.2007, 15:43
Спасибо за помощь. Топик закрыт.