Actionscript 3, пишущий элемент XML внутри другого с кодом - PullRequest
1 голос
/ 22 сентября 2011

У меня проблемы с простым XML-кодированием. Я использую простое флэш-приложение для написания XML, содержащего данные о клиентах (простые вещи, такие как номер телефона, имя, адрес электронной почты и т. Д.)

Я понимаю, как писать XML вручную, но моя проблема возникает, когда я хочу создать элемент внутри другого элемента. Я использую AS3.

Так, например, у меня есть следующий xml.

<xmlcontainer>
  <client>
    <name>Marco</name>
    <phone>123456789</phone>
  </client>
  <client>
    <name>Roberto</name>
    <phone>987654321</phone>
  </client>
</xmlcontainer>

Если я хочу добавить новый элемент, это нормально. Но я не уверен, как добавить элемент ВНУТРИ, как только это будет сделано в коде.

До сих пор я использовал .appendChild(<client/>), но появляются ошибки, когда я делаю элемент внутри элемента. Я пытался писать как текстовый элемент (то есть вручную), просто набрав .appendChild("<client><name>Marco</name></client>"), но символы меньше и больше, чем правильно, передаются неправильно.

Может ли кто-нибудь помочь мне здесь?

РЕДАКТИРОВАТЬ: По запросу, здесь полный код.

function appendXML():void{

var xmlData:XML = new XML();
var xmlrequest:URLRequest = new URLRequest(String("xml/clientelist.xml"));
xmlLoader.load(xmlrequest);
xmlLoader.addEventListener(Event.COMPLETE, LoadXML);

function LoadXML(e:Event):void
{
        xmlData = new XML(e.target.data);
        xmlData.appendChild(<pessoa/>);
    xmlData.appendChild(<id/>);
    xmlData.id.appendChild(idfield.text);
    xmlData.appendChild(<nome/>);
    xmlData.nome.appendChild(nomefield.text);
    xmlData.appendChild(<email/>);
    xmlData.email.appendChild(emailfield.text);
    xmlData.appendChild(<contacto/>);
    xmlData.contacto.appendChild(contacto1field.text);
        trace(xmlData);

    var fileb:FileReference = new FileReference;
    fileb.save( xmlData, "clientelist.xml" );
}

(пессоа = человек, ном = имя, контактный = номер телефона)

Ответы [ 3 ]

1 голос
/ 22 сентября 2011

Я не получаю ошибок с вашим кодом.Я изменил значения текстового поля и жестко закодирован как строка для тестирования.Так какие ошибки вы получаете?Похоже, ваш xml-ответ от сервера может быть поврежден.

Следующий код является рабочим примером, хотя я не думаю, что данные структурированы так, как вы хотите.

 var xmlData:XML = new XML(<xmlcontainer>
  <client>
    <name>Marco</name>
    <phone>123456789</phone>
  </client>
  <client>
    <name>Roberto</name>
    <phone>987654321</phone>
  </client>
</xmlcontainer>
);
xmlData.appendChild(<pessoa/>);
xmlData.appendChild(<id/>);
xmlData.id.appendChild('idFieldText');
xmlData.appendChild(<nome/>);
xmlData.nome.appendChild('nameFieldText');
xmlData.appendChild(<email/>);
xmlData.email.appendChild('email');
xmlData.appendChild(<contacto/>);
xmlData.contacto.appendChild('phone');
trace(xmlData);

// output is 
<xmlcontainer>
  <client>
    <name>Marco</name>
    <phone>123456789</phone>
  </client>
  <client>
    <name>Roberto</name>
    <phone>987654321</phone>
  </client>
  <pessoa/>
  <id>idFieldText</id>
  <nome>nameFieldText</nome>
  <email>email</email>
  <contacto>phone</contacto>
</xmlcontainer>

// And to build on it dont forget to add CDATA tags to all user input fields.<br/>
var xmlData:XML = new XML(<xmlcontainer>
  <client>
    <name>Marco</name>
    <phone>123456789</phone>
  </client>
  <client>
    <name>Roberto</name>
    <phone>987654321</phone>
  </client>
</xmlcontainer>
);
var userID:String = '123456789'
var userName:String = 'John doe'
var email:String = 'my@email.com'
var phone:String = '888-555-1212'

xmlData.appendChild(<pessoa/>);
xmlData.appendChild(<id/>);
xmlData.id.appendChild( new XML( "\<![CDATA[" + userID + "]]\>" ));
xmlData.appendChild(<nome/>);
xmlData.nome.appendChild( new XML( "\<![CDATA[" + userName + "]]\>" ));
xmlData.appendChild(<email/>);
xmlData.email.appendChild( new XML( "\<![CDATA[" + email + "]]\>" ));
xmlData.appendChild(<contacto/>);
xmlData.contacto.appendChild( new XML( "\<![CDATA[" + userID + "]]\>" ));
trace(xmlData);

//output is 
<xmlcontainer>
  <client>
    <name>Marco</name>
    <phone>123456789</phone>
  </client>
  <client>
    <name>Roberto</name>
    <phone>987654321</phone>
  </client>
  <pessoa/>
  <id><![CDATA[123456789]]></id>
  <nome><![CDATA[John doe]]></nome>
  <email><![CDATA[my@email.com]]></email>
  <contacto><![CDATA[123456789]]></contacto>
</xmlcontainer>

// to expand farther and clean up

var xmlData:XML = new XML(<xmlcontainer>
  <client>
    <name>Marco</name>
    <phone>123456789</phone>
  </client>
  <client>
    <name>Roberto</name>
    <phone>987654321</phone>
  </client>
</xmlcontainer>
);
var userID:String = '123456789'
var userName:String = 'John doe'
var email:String = 'my@email.com'
var phone:String = '888-555-1212'



var client:XML = new XML(<client/>)
//client.appendChild(<id/>);
client.appendChild( new XML( "<id>\<![CDATA[" + userID + "]]\></id>" ));
client.appendChild( new XML( "<nome>\<![CDATA[" + userName + "]]\></nome>" ));
client.appendChild( new XML( "<email>\<![CDATA[" + email + "]]\></email>" ));
client.appendChild( new XML( "<contacto>\<![CDATA[" + userID + "]]\></contacto>" ));

xmlData.appendChild(client);

trace(xmlData);

// output is
<xmlcontainer>
  <client>
    <name>Marco</name>
    <phone>123456789</phone>
  </client>
  <client>
    <name>Roberto</name>
    <phone>987654321</phone>
  </client>
  <client>
    <id><![CDATA[123456789]]></id>
    <nome><![CDATA[John doe]]></nome>
    <email><![CDATA[my@email.com]]></email>
    <contacto><![CDATA[123456789]]></contacto>
  </client>
</xmlcontainer>

И чтобы подвести итог вашего вопроса.Когда вы добавляете узел «клиент» в вашем случае, вы можете настроить его только двумя способами.Первый способ - создать XMLList и перебирать его, пока не найдете тот, который вы ищете.Это связано с тем, что у вас есть несколько «клиентов».Второй способ - идентифицировать клиентов, например, атрибут.Если вы знаете идентификатор, вы можете легко нацелиться на этот конкретный узел.

0 голосов
/ 22 сентября 2011

Вы можете использовать в нотации XML { here_my_var_to_replace }, например, для замены ваших динамических данных

Вот пример:

function addClient(xml:XML, name:String, phone:String):void {
 // will replace into tpl replace {name} and {phone} by their values
 var tpl:XML=<client><name>{name}</name><phone>{phone}</phone></client>;

 // append the new node to the xml
 xml.appendChild(tpl);
}

// test

var myXML:XML=<xmlcontainer>
  <client>
    <name>Marco</name>
    <phone>123456789</phone>
  </client>
  <client>
    <name>Roberto</name>
    <phone>987654321</phone>
  </client>
</xmlcontainer>;

addClient(myXML, "foo", "12345678");

trace(myXML.toXMLString());
// output:
<xmlcontainer>
  <client>
    <name>Marco</name>
    <phone>123456789</phone>
  </client>
  <client>
    <name>Roberto</name>
    <phone>987654321</phone>
  </client>
  <client>
    <name>foo</name>
    <phone>12345678</phone>
  </client>
</xmlcontainer>
0 голосов
/ 22 сентября 2011

Попробуйте:

var xml:XML = <a/>      
xml.appendChild(new XML("<b>hello</b>"))
trace(xml.toXMLString());

Вы должны получить

<a><b>hello</b></a>
...