2017-11-18 5 views
0

XmlSerializerXmlWriter/XMLReaderを使用して、XML設定ファイルとの間でオブジェクトをシリアル化しようとしています。最も単純な形式で指定されたXMLノードとの間でオブジェクトを直列化/逆シリアル化する方法

これはかなり簡単です:

XmlSerializer oSerializer = new XmlSerializer(typeof(mySettings), new XmlRootAttribute("Settings")); 
    using (XmlWriter oXmlWriter = XmlWriter.Create(myFilePath) 
     oSerializer.Serialize(oXmlWriter, mySettings); 

XmlSerializer oSerializer = new XmlSerializer(typeof(mySettings), new XmlRootAttribute("Settings")); 
    using (XmlReader oXmlReader = XmlReader.Create(myFilePath) 
     oSerializer.Serialize(oXmlWriter, mySettings); 

が生成し、読み込み(簡単な例):

<?xml version="1.0" encoding="utf-8"?> 
<Settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Token>NC05MWY4NmJkOGRl</Token> 
    <TokenExpiry>2017-11-01</TokenExpiry> 
    <TokenType>bearer</TokenType> 
</Settings> 

しかし、私がしようとしています異なるノードにある同じオブジェクトのさまざまなバージョンを保存します(読み込みます)。

<?xml version="1.0" encoding="utf-8"?> 
<Settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <ThisSetting> 
    <Token>NC05MWY4NmJkOGRl</Token> 
    <TokenExpiry>2017-11-01</TokenExpiry> 
    <TokenType>bearer</TokenType> 
    </ThisSetting> 
    <ThatSetting> 
    <Token>eyJ0eXAiOiJKV1Qi</Token> 
    <TokenExpiry>2017-11-05</TokenExpiry> 
    <TokenType>token</TokenType> 
    </ThatSetting> 
</Settings> 

:オブジェクトの同じクラスが書かれているように、XML構造は、ノード間で同一です。

手動で記述することができますThisSettingおよびThatSetting;それらはオブジェクト定義の一部ではありません。ファイルが最初に存在しないか、またはThatSetting ThisSetting ThisSetting(ファイル内の順序は関係ありません)を保存すると、の場合にのみ、ファイルが最初に存在しない状況を処理する必要があるため、ノードを追加する必要があります。 (私は単純に複数のファイルを持つことができますが、それはかなり控えめなものです)

これを行うには誰も簡単できれいな方法を提供できますか?明らかに、私は手作業でファイルの書き込みと読み取りを解析することができますが、それは必要ではないようです。私は、プロパティを囲むようThisSettingThatSettingを提供するオブジェクトをラップすることができ、しかしThisSettingThatSetting名前と番号に変えることができ、経時的に変化することができる製品名に応じて動的です。

アイデア?明白な何かを逃したことがありますか?

+0

開始タグと終了タグは、同様のことが書かれていないでしょうか? – Nikolaus

+0

ファイル(XML)またはデータベースに保存しますか? – Nikolaus

+0

@Nikolaus Typo、申し訳ありません。一定。投稿ごとにファイル(例:settings.xml)。 – SteveCinq

答えて

0

簡単には、XML LINQを行うには: ` `:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 


namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 

      XElement settings = doc.Root; 

      List<XElement> children = settings.Elements().ToList(); 

      settings.Descendants().Remove(); 

      settings.Add(new XElement("ThisSettings", children)); 
     } 
    } 
} 
関連する問題