2

xml ファイルを更新し、既に保存されているルート要素内に要素を保存しようとしています。

xml ファイルが開かれただけで保存されていない例しか見つかりませんでした。結果を保存するための最良の方法を見つけるのを手伝ってくれる人はいますか?

私のプロジェクトは現在次のようになっています。

URLLoader/URLRequest を介して xml ファイルをロードし、いくつかのテキスト フィールドにコンテンツを表示しています。入力フィールドからの新しいテキストは、FileStream を介して applicationStorageDirectory (iPhone にある) の xml ファイルに直接保存 (追加) されます。

次に、新しい入力を画面上のリスト (for ループで作成) に追加して表示する必要がありますが、そこまで到達することはできません。xml ファイルから新しく保存された入力を読み取った後、xml ファイルが適切な形式ではないため、自然にエラー 1088 が発生します。

これは、入力がルート要素の後に追加され、結果が次のようになるためです。

<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 に答える