Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Удалить XML узел не зная его индекс, но зная значение одного из его атрибутов (http://www.flasher.ru/forum/showthread.php?t=148326)

MetSerp 27.12.2010 23:51

Удалить XML узел не зная его индекс, но зная значение одного из его атрибутов
 
Здравствуйте.
Появилась задача:
есть объект XML
Код AS3:

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

Заполняется он динамически.
Код AS1/AS2:

                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.
Код AS3:

                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.
Или я все же ошибаюсь?
так как первое что я попробовал это
Код AS3:

                                delete outPutXML.pathGrid.pointGrid.(@id == e.target.name);

Цитата:

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

Код AS1/AS2:

trace (outPutXML.pathGrid.pointGrid.(@id == e.target.name).@id);

то вернется верное значение атрибута id

Добавлено через 32 секунды
Цитата:

Сообщение от Anton Riot (Сообщение 960290)
сколько элементов в pathGrid?

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

Wolsh 28.12.2010 00:39

Код AS3:

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

Цитата:

Сообщение от Wolsh (Сообщение 960296)
Код AS3:

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());


да, спасибо - то что нужно
Код AS1/AS2:

                                delete outPutXML.pathGrid.pointGrid.(@id == e.target.name)[0];

правда почему то последний элемент она отказывается удалять.
Ну то есть если сделать 4 элемента в узле pathGrid то удалить из них можно любые 3, один все равно останется, но это я уже покопаю у себя код, скорее всего где то что то закосячил.

Wolsh 28.12.2010 00:58

Код AS3:

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

Цитата:

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

разобрался, все работало правильно, просто когда делается
Цитата:

trace (outPutXML.pathGrid);
а pathGrid у меня соответственно пустой и в данном случае именно он является корневым элементом, то я просто получаю пусто в консоль вывода, но визуально это выглядит будто в консоль вывода что то добавилось и глядя туда я то вижу предыдущий вывод в котором висит этот 1 элемент.
но если сделать как надо в данном случае то есть
Код AS3:

                                trace (outPutXML.pathGrid.toXMLString());

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

Wolsh 28.12.2010 01:56

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

MetSerp 28.12.2010 02:24

Цитата:

И просто просьба на будущее - не надо цитировать предыдущее сообщение, оно итак перед глазами.
прошу прощения, тут я процитировал с той целью что б не получилось путаницы если кто то еще ответит пока я набираю сообщение, как например получилось с этим сообщением, началом которого является ответ на ваше удаленное сообщение, но поскольку сообщения нет, то получается как мое размышление на тему xmllist которое совершенно там левое.
И чтобы никто не решил что у меня последняя стадия шизофрении , я процитировал ваше сообщение в этот раз.
Цитата:

Добро пожаловать на наш форум)) Удачи!
спасибо.


Часовой пояс GMT +4, время: 08:46.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.