2011-09-22 25 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>