0

アプリは時々ノードをGoals.xmlファイルに追加する必要があります。だからそのdynamic。ノードを追加するコード:

XmlWriterSettings settings=new XmlWriterSettings();  
settings.OmitXmlDeclaration= true;
settings.Indent = true;
settings.IndentChars = ("\t");

using (IsolatedStorageFile myIsolatedStorage = 
    IsolatedStorageFile.GetUserStoreForApplication())
using (IsolatedStorageFileStream stream = 
    myIsolatedStorage.OpenFile("Goals.xml", FileMode.Append))
{
    XmlSerializer serializer = new XmlSerializer(typeof(List<Goals>));
    using (XmlWriter xmlWriter = XmlWriter.Create(stream, settings))
    {
        serializer.Serialize(
            xmlWriter, 
            GenerateGoalsData(name, description, progress));
    }
}

private List<Goals> GenerateGoalsData(
    string name, 
    string description, 
    string progress)
{
    List<Goals> data = new List<Goals>();
    data.Add(new Goals() { 
            Name=name, 
            Description=description, 
            Progress=progress});
    return data;
}

また、クラスがありGoalsます。しかし、それは悪いものを生成しますXML:

<ArrayOfGoals xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Goals>
        <Name>Jack</Name>
        <Description>lalala</Description>
        <Progress>97</Progress>
    </Goals>
</ArrayOfGoals>
<ArrayOfGoals xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Goals>
        <Name>Taaaaaa</Name>
        <Description>nanana</Description>
        <Progress>50</Progress>
    </Goals>
</ArrayOfGoals>

XML繰り返し削除する方法:

</ArrayOfGoals>
<ArrayOfGoals xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">

そのようにXML見えます:

<ArrayOfGoals xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Goals>
        <Name>Jack</Name>
        <Description>lalala</Description>
        <Progress>97</Progress>
    </Goals>
    <Goals>
        <Name>Taaaaaa</Name>
        <Description>nanana</Description>
        <Progress>50</Progress>
    </Goals>
</ArrayOfGoals>

または、その文字列が自動的に追加されずにノードを追加する方法は?

4

3 に答える 3

2

データを逆シリアル化し、新しい値を追加してシリアル化します。しかし、FileMode.Create 代わりに使用FileMode.Append

于 2012-09-09T17:23:05.150 に答える
2

結果のファイルは無効な XML であるため、有効な XML として逆シリアル化に直接使用することはできません。

しかし、実際には標準クラスで読み取ることができる有効な「Xml フラグメント」です。XmlReader.Create 呼び出しの XmlReaderSettings で ConformanceLevel.Frament を指定すると、XmlReader はフラグメントを読み取ることができます。そのようなリーダーからクラスを直接逆シリアル化することもできると思います(わかりません)。

補足: 古いデータを読み取り、必要なものを追加し、ファイル全体としてシリアル化する方がはるかに簡単です (ただし、問題やバグは少なくなります)。

于 2012-09-09T17:39:27.527 に答える