2011-09-22 61 views
1

我在使用简单的XML编码时遇到了一些问题。我正在使用一个简单的Flash应用程序来编写包含客户数据的XML(简单的东西,如电话号码,姓名,电子邮件等)。Actionscript 3使用代码编写另一个XML元素

我明白如何手动编写XML,但我的问题来了,当我想在另一个元素内创建一个元素。我正在使用AS3。

所以,例如,我有以下的XML。

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

如果我想添加一个新的元素,多数民众赞成罚款。但是我不知道如何在代码中完成INSIDE元素的添加。

到目前为止,我一直在使用.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"); 
} 

(昂佩索阿=人,诺姆=名称,CONTACTO = PHONENUMBER)

+0

您可以发布您遇到麻烦的代码吗? –

+0

编辑问题时使用我在构建XML时调用的函数。请注意,这些“idfield.text”是文本字段,并且我已确认它们可以工作。 – FoxLift

回答

1

我没有得到任何错误,你的代码。
我修改了文本字段值并将其硬编码为字符串进行测试。
那么你会得到什么错误?
听起来像我的服务器的XML响应可能会中断。


下面的代码是一个工作例子,虽然我不thinkthe数据的结构,你想要的方式。

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 = '[email protected]' 
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[[email protected]]]></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 = '[email protected]' 
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[[email protected]]]></email> 
    <contacto><![CDATA[123456789]]></contacto> 
    </client> 
</xmlcontainer> 

并总结你的问题。
当您在您的案例中添加节点“客户端”时,您只能以两种方式进行定位。
第一种方法是创建一个XMLList并遍历它,直到找到正在查找的XMLList。这是因为你有多个“客户”。
第二种方法是以某种方式将客户端标识为例如属性。
如果您知道Id,您可以轻松地定位该特定节点。

+0

我不怀疑你的理由,但为什么使用CDATA而不是正常的appendChilds? – FoxLift

+0

CDATA是节点本身的字符串包装。如果不需要的字符不是XML友好的输入到您的文本字段它不会破坏你的XML –

0

尝试:

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

你应该得到

0

您可以在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>