我正在尝试更新已保存的根元素中的xml文件和保存元素 。
我只找到了xml文件刚刚打开但未保存的示例。有人可以帮我找到保存结果的最佳方法吗?
我的项目现在看起来像这样:
我正在通过URLLoader / URLRequest加载xml文件,并在几个文本字段中显示内容。输入字段中的新文本通过FileStream直接保存(追加)到applicationStorageDirectory中的xml文件(将在iPhone上)。
然后应该将新输入添加到屏幕列表(使用for循环创建)并显示,但是,它无法获得它。从xml文件中读取新保存的输入后,我自然会得到错误1088,因为xml文件不再格式良好。
这是因为输入附加在根元素之后,结果如下所示:
<root>
<message></message>
<date></date>
</root>
<message>new input</message>
<date></date>
当然,我想要的是:
<root>
<message></message>
<date></date>
<message>new input</message>
<date></date>
</root>
但我不知道如何实现这一点。
我做了几次尝试以避免必须追加,比如加载xml内容,更改它,然后再次写入所有内容。但是因为我还是新手,所以我无法让它发挥作用。
如果有人能告诉我最好的方法是什么,也许如何解决它会很棒。
答案 0 :(得分:0)
好吧,我想发布一个关于我目前所处位置的更新......
这应该能够为大多数对象输出XML,到目前为止,我只是向它提出了一些测试用例,如果您想开始尝试使用它进行调试,请告诉我您是否有任何部分缺失或XML错误输出让我知道...我将继续并尝试使用解析器来反转此版本生成的XML在我执行此操作时可能会更改的过程。
package
{
import flash.utils.describeType;
import mx.collections.IList;
public class AS3ToXMLMapper
{
public function AS3ToXMLMapper()
{
}
public static function generateXML(objectToMap:Object, basePropertyName:String="root"):String
{
var describeXML:XML = describeType(objectToMap);
var xmlOutput:String = "<"+basePropertyName+" name=\""+describeXML.@name+"\" base=\""+describeXML.@base+"\">\n";
if(describeXML.@isDynamic=="true")
{
for(var property:String in objectToMap)
{
xmlOutput += "<"+property+">";
xmlOutput += objectToMap[property];
xmlOutput += "</"+property+">";
}
}
else if(objectToMap is XML)
{
xmlOutput+=(objectToMap as XML).toString();
}
else if(objectToMap is XMLList)
{
xmlOutput+=(objectToMap as XMLList).toString();
}
else
{
for each(var accessor:XML in describeXML..accessor)
{
xmlOutput+="\t"+exportProperty(objectToMap, accessor,true);
}
for each(var variable:XML in describeXML..variable)
{
xmlOutput+="\t"+exportProperty(objectToMap, variable, false);
}
}
xmlOutput += "</"+basePropertyName+">\n";
trace(xmlOutput);
return xmlOutput;
}
private static function exportProperty(objectToMap:Object, xmlObj:XML, isAccessor:Boolean):String
{
var xmlOutput:String="";
var propName:String = xmlObj.@name.toString();
var objectValue:Object = objectToMap[propName];
if(!objectValue)
{
xmlOutput += "<"+propName+">";
xmlOutput += "</"+propName+">";
return xmlOutput;
}
if(isAccessor && xmlObj.@access != "readwrite")
{
return "";
}
if(objectValue is Array)
{
return exportArray(objectValue as Array, xmlObj.@name);
}
else if(objectValue is IList)
{
return exportArray((objectValue as IList).toArray(), propName);
}
else if(objectValue is int || objectValue is Number || objectValue is String || objectValue is uint || objectValue is Boolean)
{
xmlOutput += "<"+propName+" type=\""+xmlObj.@type+"\">";
xmlOutput += objectValue;
xmlOutput += "</"+propName+">";
}
else
{
return generateXML(objectValue, propName);
}
return xmlOutput;
}
private static function exportArray(array:Array, arrayName:String):String
{
var xmlOutput:String = "<"+arrayName+">\n";
for each(var element:Object in array)
{
xmlOutput+="\t"+generateXML(element,"arrayElement");
}
xmlOutput += "</"+arrayName+">\n";
return xmlOutput;
}
}
}
用法如下:
var fs:FileStream = new FileStream();
fs.open(new File("C:\\test.xml"),FileMode.WRITE);
var thingToExport:Object = {aProperty:"someValue"};
var as3XMLMapper:String = AS3ToXMLMapper.generateXML(thingToExport);
fs.writeUTFBytes(as3XMLMapper);
fs.close();
答案 1 :(得分:0)
简单地使用XML文字不是更好吗?
package
{
import flash.display.Sprite;
public class ZutAlors extends Sprite
{
public function ZutAlors()
{
trace(messagesToXMLString('hello world'.split(' ')));
}
private function messageToXML(m:String, d:Date = null):XMLList
{
return <ret>
<message>{m}</message>
<date>{(d || new Date()).toString()}</date>
</ret>.children();
}
private function messagesToXMLString(array:Array):XML
{
const ret:XML = <root />
for each(var s:String in array)
{
ret.appendChild(messageToXML(s));
}
return ret;
}
}
}
如果XML格式不正确,则会出现编译错误...