2

我正在尝试更新 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 内容,更改它,然后重新编写所有内容。但由于我还是 as3 的新手,我无法让它工作。

如果有人能告诉我最好的方法是什么以及如何解决它,那就太好了。

4

2 回答 2

1

简单地使用 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 格式不正确,则会出现编译错误...

于 2012-06-18T07:38:51.020 回答
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();
于 2012-06-16T01:50:32.280 回答