Форум 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=174059)

Srednas 17.01.2012 11:10

Добавление данных в XML
 
Здравствуйте.

Нужно добавить в XML некоторые данные и сохранить в измененном виде.

Код AS3:

var xml:XML = getXML();
 
var ns:Namespace = new Namespace("ps", "http://www.example.ru");
xml.addNamespace(ns);
 
var s:String = new String();
s += "<ps:GeoInfo>";
        s += "<ps:Geo>";
                s += "<ps:GeoItem Latitude='"+37.234087+"' Longitude='"+74.88986+"+"' />";
                s += "<ps:GeoItem Latitude='"+38.244042+"' Longitude='"+75.215684+"+"' />";
        s += "</ps:Geo>";
s += "</ps:GeoInfo>";
 
xml.insertChildBefore(null, XML(s));

вылезает ошибка:
Код:

The prefix "ps" for element "GeoInfo" is not bound.
Подскажите как вставить правильно новые данные в XML?

wvxvw 17.01.2012 12:17

Код AS3:

var xml:XML = <foo xmlns:ps="http://www.example.ru"/>;
 
xml.* =
        <ps:GeoInfo xmlns:ps="http://www.example.ru">
                <ps:Geo>
                        <ps:GeoItem Latitude={37.234087} Longitude={74.88986}/>
                        <ps:GeoItem Latitude={38.244042} Longitude={75.215684}/>
                </ps:Geo>
        </ps:GeoInfo>
+ xml.*;
trace(xml);

ЗЫ. Не пишите new String() - это выражение не имеет никакого смысла. Строки в AS не мутабельные, а для пустой строки есть константа - "".

silin 17.01.2012 12:49

Код AS3:

var test:XML = <test/>;
var ns:Namespace = new Namespace("ps", "http://www.example.ru");
default xml namespace = ns;
test.addNamespace(ns);
test.appendChild(<GeoInfo/>);
test.GeoInfo.appendChild(<Geo />);
test.GeoInfo.Geo.appendChild(< item Latitude = "37.234087" Longitude="74.88986"/>);
test.GeoInfo.Geo.appendChild(< item Latitude = "38.244042" Longitude="75.215684"/>);
trace( test.toXMLString() );


Srednas 18.01.2012 08:28

Цитата:

Сообщение от silin (Сообщение 1057440)
Код AS3:

var test:XML = <test/>;
var ns:Namespace = new Namespace("ps", "http://www.example.ru");
default xml namespace = ns;
test.addNamespace(ns);
test.appendChild(<GeoInfo/>);
test.GeoInfo.appendChild(<Geo />);
test.GeoInfo.Geo.appendChild(< item Latitude = "37.234087" Longitude="74.88986"/>);
test.GeoInfo.Geo.appendChild(< item Latitude = "38.244042" Longitude="75.215684"/>);
trace( test.toXMLString() );


Проблема, по большей части, при добавлении новой информации в старую, открытую для изменения XML.
Почему-то все равно ругается на префикс
Код AS3:

test.appendChild(<ps: GeoInfo/>);

Ругается:
Код:

The prefix "ps" for element "GeoInfo" is not bound.

silin 18.01.2012 10:04

ага, т.е. проблема в том, что невозможно создать нод в неймспейсе литералом,
но непонятно почему не подходит создавать его из-под <default xml namespace>
Код AS3:

var ns:Namespace = new Namespace("ps", "http://www.example.ru");
var node:XML;
try
{
        node=<ps:GeoInfo/>; // проблема
}catch (error:Error)
{
        trace( "err : " + error.message );
        default xml namespace = ns;
        node=<GeoInfo/>; // нет проблемы
}
trace( "node : " + node.toXMLString() );


wvxvw 18.01.2012 11:54

Так а чем мой вариант не подошел?

Srednas 18.01.2012 13:10

Цитата:

Сообщение от wvxvw (Сообщение 1057641)
Так а чем мой вариант не подошел?

Подскажите как его добавить в существующую XML?
Т.е. где-то лежит XML, её нужно открыть, прочитать из неё нужные данные, обработать и добавить сформированные новые данные.

Например, первоначальная XML:
Код:

<svg version="1.1" xmlns:ps="http://www.example.ru" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="1016.195px" xml:space="preserve">
<path fill="#C4C4C4"d="M313.098,99.213l-9.5-14l9.5-12.5l16.5,3.5l8,13.5l-17,9.5H313.098z"/>
</svg>

После обработки нужно новые данные записать в файл, чтобы получилось:
Код:

<svg version="1.1" xmlns:ps="http://www.example.ru" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="1016.195px" xml:space="preserve">
<path fill="#C4C4C4"d="M313.098,99.213l-9.5-14l9.5-12.5l16.5,3.5l8,13.5l-17,9.5H313.098z"/>
<ps:GeoInfo xmlns:ps="http://www.example.ru">
        <ps:Geo>
                <ps:GeoItem Latitude={37.234087} Longitude={74.88986}/>
                <ps:GeoItem Latitude={38.244042} Longitude={75.215684}/>
        </ps:Geo>
</ps:GeoInfo>

</svg>

В вашем варианте, вроде проще, но добавляется еще
Код:

<... xmlns:ps="http://www.example.ru">
он тут не нужен, т.к. уже будет в <svg> (выделен красным). Как это можно сделать?

wvxvw 18.01.2012 20:35

Код AS3:

package tests 
{
        //{ imports
        import flash.display.Sprite;
        //}
 
        /**
        * XMLAppendExample class.
        * @author wvxvw
        * @langVersion 3.0
        * @playerVersion 10.1
        */

        public class XMLAppendExample extends Sprite
        {
                //--------------------------------------------------------------------------
                //
                //  Constructor
                //
                //--------------------------------------------------------------------------
 
                /**
                * Creates new <code>XMLAppendExample</code>.
                */

                public function XMLAppendExample()
                {
                        super();
                        this.example();
                }
 
                //--------------------------------------------------------------------------
                //
                // Private methods
                //
                //--------------------------------------------------------------------------
 
                private function example():void
                {
                        var source:XML =
                        <svg version="1.1"
                                xmlns:ps="http://www.example.ru"
                                xmlns="http://www.w3.org/2000/svg"
                                xmlns:xlink="http://www.w3.org/1999/xlink"
                                x="0px" y="0px" width="1016.195px"
                                xml:space="preserve"
                                >
                                <path fill="#C4C4C4"
                                        d="M313.098,99.213l-9.5-14l9.5-12.5l16.5,3.5l8,13.5l-17,9.5H313.098z"/>
                        </svg>;
 
                        source.* = <ps:GeoInfo xmlns:ps="http://www.example.ru">
                                <ps:Geo>
                                        <ps:GeoItem Latitude={37.234087} Longitude={74.88986}/>
                                        <ps:GeoItem Latitude={38.244042} Longitude={75.215684}/>
                                </ps:Geo>
                        </ps:GeoInfo> + source.*;
                        trace(source.toXMLString());
                        /*
                        <svg version="1.1" x="0px" y="0px" width="1016.195px" aaa:space="preserve" xmlns:ps="http://www.example.ru" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:aaa="http://www.w3.org/XML/1998/namespace">
                          <ps:GeoInfo>
                                <ps:Geo>
                                  <ps:GeoItem Latitude="37.234087" Longitude="74.88986"/>
                                  <ps:GeoItem Latitude="38.244042" Longitude="75.215684"/>
                                </ps:Geo>
                          </ps:GeoInfo>
                          <path fill="#C4C4C4" d="M313.098,99.213l-9.5-14l9.5-12.5l16.5,3.5l8,13.5l-17,9.5H313.098z"/>
                        </svg>*/

                }
        }
}



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

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