PDA

Просмотр полной версии : Удалить XML узел не зная его индекс, но зная значение одного из его атрибутов


MetSerp
27.12.2010, 23:51
Здравствуйте.
Появилась задача:
есть объект XML

var outPutXML:XML = new XML(
<root>
<pathGrid>
</pathGrid>
<boards>
</boards>
<image path=""/>
</root>
);

Заполняется он динамически.
function addPathPoint (e:MouseEvent):void {
var point:CasaMovieClip = new CasaMovieClip();
outPutXML.pathGrid.appendChild (<pointGrid id={Main.pointsCounter} x={new int(pathGridPano.mouseX)} y={new int(pathGridPano.mouseY)} />);
point.addEventListener (MouseEvent.MOUSE_DOWN,movePoint);
point.addEventListener (MouseEvent.MOUSE_UP,editGridPoint);

point.graphics.beginFill (0xff0000);
point.graphics.drawCircle (0,0,5);
point.graphics.endFill ();

point.x = pathGridPano.mouseX;
point.y = pathGridPano.mouseY;
point.name = new String(Main.pointsCounter);
pathGridPano.addChildAt (point,0);
Main.pointsCounter++;
}

в итоге получается что то типа такого:
<pathGrid>
<pointGrid id="0" x="262" y="169"/>
<pointGrid id="1" x="304" y="171"/>
<pointGrid id="2" x="379" y="159"/>
<pointGrid id="3" x="294" y="107"/>
</pathGrid>
Вопрос как мне удалить или изменить определенный узел, если я не могу знать его индекс.
Если точнее, у меня есть метод который должен этим заниматься, даже 2.
function movePoint (e:MouseEvent) {
if (e.ctrlKey) {
/*
код удаляющий узел из объекта outPutXML - с ним как раз проблема
*/
e.target.destroy ();
} else {
e.target.startDrag ();

}
}
function editGridPoint (e:MouseEvent) {

e.target.stopDrag ();
/*
код изменяющий атрибуты x и y у редактируемого узла - с ним тоже проблемы
*/


}

при этом id атрибут узла который подвергается изменению/удалению - всегда равен e.target.name.

Anton Riot
28.12.2010, 00:21
сколько элементов в pathGrid?

MetSerp
28.12.2010, 00:28
насколько я знаю предикат возвращает объект XMLList, и если я правильно понимаю (но надеюсь что ошибаюсь) это не ссылка а новый объект XMLList.
Или я все же ошибаюсь?
так как первое что я попробовал это
delete outPutXML.pathGrid.pointGrid.(@id == e.target.name);

TypeError: Error #1119: Оператор "delete" с операндом типа XMLList не поддерживается.
хотя то что там 1 элемент возвращается это точно так как если сделать

trace (outPutXML.pathGrid.pointGrid.(@id == e.target.name).@id);
то вернется верное значение атрибута id

Добавлено через 32 секунды
сколько элементов в pathGrid?

произвольное количество

Wolsh
28.12.2010, 00:39
var xml:XML =
<pathGrid>
<pointGrid id="0" x="262" y="169"/>
<pointGrid id="1" x="304" y="171"/>
<pointGrid id="2" x="379" y="159"/>
<pointGrid id="3" x="294" y="107"/>
</pathGrid>
delete xml.elements().(@id == "2")[0];
trace(xml.toXMLString());

MetSerp
28.12.2010, 00:52
var xml:XML =
<pathGrid>
<pointGrid id="0" x="262" y="169"/>
<pointGrid id="1" x="304" y="171"/>
<pointGrid id="2" x="379" y="159"/>
<pointGrid id="3" x="294" y="107"/>
</pathGrid>
delete xml.elements().(@id == "2")[0];
trace(xml.toXMLString());
да, спасибо - то что нужно
delete outPutXML.pathGrid.pointGrid.(@id == e.target.name)[0];
правда почему то последний элемент она отказывается удалять.
Ну то есть если сделать 4 элемента в узле pathGrid то удалить из них можно любые 3, один все равно останется, но это я уже покопаю у себя код, скорее всего где то что то закосячил.

Wolsh
28.12.2010, 00:58
var xml:XML =
<pathGrid>
<pointGrid id="0" x="262" y="169"/>
<pointGrid id="1" x="304" y="171"/>
<pointGrid id="2" x="379" y="159"/>
<pointGrid id="3" x="294" y="107"/>
</pathGrid>
delete xml.elements().(@id == "3")[0];
delete xml.elements().(@id == "2")[0];
delete xml.elements().(@id == "1")[0];
delete xml.elements().(@id == "0")[0];
trace(xml.toXMLString()); // <pathGrid/>

Добавлено через 14 минут
Оператор delete удаляет узел. Он не может удалить список. Это и есть Error #1119.
В свою очередь outPutXML.pathGrid.pointGrid.(@id == e.target.name) возвращает именно XMLList.
XMLList это индексированный список узлов, который, подобно массиву, дает доступ к этим узлам по индексу.
Если доподлинно известно, что id уникален (а иначе что это за id, да?)), то узел в этом списке всегда будет один, и иметь индекс [0]. И вот узел мы уже можем безболезненно удалить.

MetSerp
28.12.2010, 01:29
Оператор delete удаляет узел. Он не может удалить список. Это и есть Error #1119.
В свою очередь outPutXML.pathGrid.pointGrid.(@id == e.target.name) возвращает именно XMLList.
XMLList это индексированный список узлов, который, подобно массиву, дает доступ к этим узлам по индексу.
Если доподлинно известно, что id уникален (а иначе что это за id, да?)), то узел в этом списке всегда будет один, и иметь индекс [0]. И вот узел мы уже можем безболезненно удалить.
разобрался, все работало правильно, просто когда делается
trace (outPutXML.pathGrid);
а pathGrid у меня соответственно пустой и в данном случае именно он является корневым элементом, то я просто получаю пусто в консоль вывода, но визуально это выглядит будто в консоль вывода что то добавилось и глядя туда я то вижу предыдущий вывод в котором висит этот 1 элемент.
но если сделать как надо в данном случае то есть
trace (outPutXML.pathGrid.toXMLString());

то как раз и получаю то что мне и нужно - то что pathGrid у меня пустой.
Так что все работает, просто я довольно невнимателен бываю :rolleyes:

Wolsh
28.12.2010, 01:56
Ага. И просто просьба на будущее - не надо цитировать предыдущее сообщение, оно итак перед глазами. Цитаты нужны для конкретизации фразы, которую Вы комментируете, или при ответе на старое сообщение, которое уже на другой странице.
Добро пожаловать на наш форум)) Удачи!

MetSerp
28.12.2010, 02:24
И просто просьба на будущее - не надо цитировать предыдущее сообщение, оно итак перед глазами.
прошу прощения, тут я процитировал с той целью что б не получилось путаницы если кто то еще ответит пока я набираю сообщение, как например получилось с этим (http://www.flasher.ru/forum/showpost.php?p=960293&postcount=3) сообщением, началом которого является ответ на ваше удаленное сообщение, но поскольку сообщения нет, то получается как мое размышление на тему xmllist которое совершенно там левое.
И чтобы никто не решил что у меня последняя стадия шизофрении , я процитировал ваше сообщение в этот раз.
Добро пожаловать на наш форум)) Удачи!
спасибо.