在as3中编写,更新并保存格式正确的xml文件

时间:2012-06-15 21:59:16

标签: xml actionscript-3 flash actionscript filestream

我正在尝试更新已保存的根元素中的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内容,更改它,然后再次写入所有内容。但是因为我还是新手,所以我无法让它发挥作用。

如果有人能告诉我最好的方法是什么,也许如何解决它会很棒。

2 个答案:

答案 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格式不正确,则会出现编译错误...