2012-05-03 5 views
0

XDocumentのLINQを使用してXML要素をC#クラスにロードする方法。私は、XDocument.Descendantsを使用したくないのです。なぜなら、設定は繰り返されず、XMLで1回しか発生しないからです。クラスにXDocumentのLINQを使用してXML要素をロードする方法(子孫を使用しない)

これはうまくいきますが、私はIEnumerableを使うか、ToArray()を使用して最初の要素[0]を使う必要がない別の方法があると思います。助言がありますか?

CODE

public class BackupItem // class needed so LINQ reads XML into an editable DbGrid 
{ 
    public bool Backup { get; set; } 
    public bool IncludeSubDir { get; set; } 
    public string BackupLabel { get; set; } 
    public string BackupPath { get; set; } 
} 

public class BackupSettings 
{ 
    public bool IncludeDateStamp { get; set; } 
    public bool DatePrefix { get; set; } 
    public bool DateSuffix { get; set; } 
    public string DateFormat { get; set; } 
    public bool ZipCompress { get; set; } 
    public bool ZipPrefix { get; set; } 
    public bool ZipSuffix { get; set; } 
    public string ZipText { get; set; } 
    public bool BackupToSiblingFolder { get; set; } 
    public string SiblingFolder { get; set; } 
    public bool BackupToFolder { get; set; } 
    public bool IncludeFullPath { get; set; } 
    public string BackupFolder { get; set; } 
} 


    // use a LINQ query to load xml file into datagridview and make datagrid editable (create class with get/set) 
    var q = from arg in GvXMLDoc.Descendants("BackupItem") 
      select new BackupItem() 
      { 
      Backup = (bool)arg.Element("IncludeDirectory"), 
      IncludeSubDir = (bool)arg.Element("IncludeSubDirectories"), 
      BackupLabel = (string)arg.Element("BackupLabel"), 
      BackupPath = (string)arg.Element("BackupPath") 
      }; 
    dataGridView1.DataSource = q.ToList(); 

    // load global variable 
    IEnumerable<BackupSettings> GvBackupSettings = from arg in GvXMLDoc.Element("Backup").Elements("Settings") 
                select new BackupSettings() 
      { 
       IncludeDateStamp = (bool)arg.Element("IncludeDateStamp"), 
       DatePrefix = (bool)arg.Element("DatePrefix"), 
       DateSuffix = (bool)arg.Element("DateSuffix"), 
       DateFormat = (string)arg.Element("DateFormat"), 
       ZipCompress = (bool)arg.Element("ZipCompress"), 
       ZipPrefix = (bool)arg.Element("ZipPrefix"), 
       ZipSuffix = (bool)arg.Element("ZipSuffix"), 
       ZipText = (string)arg.Element("ZipText"), 
       BackupToSiblingFolder = (bool)arg.Element("BackupToSiblingFolder"), 
       SiblingFolder = (string)arg.Element("SiblingFolder"), 
       BackupToFolder = (bool)arg.Element("BackupToFolder"), 
       IncludeFullPath = (bool)arg.Element("IncludeFullPath"), 
       BackupFolder = (string)arg.Element("BackupFolder") 
      }; 

私は値にアクセスすることができますが、それは非常に '汚いやり方' そうです。

var s = GvBackupSettings.ToArray()[0].DateSuffix; 
var t = GvBackupSettings.ToArray()[0].DateFormat; 

XMLファイル

<?xml version='1.0'?> 
<Backup> 
    <Settings> 
    <IncludeDateStamp>true</IncludeDateStamp> 
    <DatePrefix>false</DatePrefix> 
    <DateSuffix>true</DateSuffix> 
    <DateFormat>yyyy-MM-dd h.m.s</DateFormat> 
    <ZipCompress>false</ZipCompress> 
    <ZipPrefix>false</ZipPrefix> 
    <ZipSuffix>false</ZipSuffix> 
    <ZipText></ZipText> 
    <BackupToSiblingFolder>true</BackupToSiblingFolder> 
    <SiblingFolder>backups</SiblingFolder> 
    <BackupToFolder>false</BackupToFolder> 
    <IncludeFullPath>true</IncludeFullPath> 
    <BackupFolder>C:\\backup</BackupFolder> 
    </Settings> 
    <BackupItem> 
    <IncludeDirectory>true</IncludeDirectory> 
    <IncludeSubDirectories>true</IncludeSubDirectories> 
    <BackupLabel>Backup1</BackupLabel> 
    <BackupPath>C:\TestFiles\Xml\Samples</BackupPath> 
    </BackupItem> 
    <BackupItem> 
    <IncludeDirectory>true</IncludeDirectory> 
    <IncludeSubDirectories>false</IncludeSubDirectories> 
    <BackupLabel>Backup2</BackupLabel> 
    <BackupPath>C:\TestFiles\Xml\Samples</BackupPath> 
    </BackupItem> 
</Backup> 

EDIT 1 私はまた、XMLをデシリアライズする(アイデアに感謝を)しようとしているので、私は、各項目をキャストする必要はありません。使用して以下に提案されているようなXMLのシリアライズとデシリアライズ終わったこの..私はどちらかのXSDツールを実行し、巨大なクラスファイルを持っている必要がしたくない動作しません...

XmlRootAttribute rootAttribute = new XmlRootAttribute("Backup"); 
    XmlSerializer deserializer = new XmlSerializer((typeof(BackupSettings)), rootAttribute); 
    GvBackupSettings = (BackupSettings)deserializer.Deserialize(XmlReader.Create(GvXMLFileName)); 

EDIT 2 stardard XSD.exeツールを使用してC#クラスを生成します。特に同じXMLファイルを読み書きする必要があったためです。注:生成されたxsdファイルを最初に確認/変更することを確認してください。

+0

とデシリアライズは、なぜ動作しませんか? – Bazzz

+0

@Bazzz私はあなたの提案を試みた(上記の編集を参照)。多分それは働くことができます。私は、クラスを作成してクラスを維持するためにXSDツールを実行する必要がないようにしようとしています。また、このように設定して、BackupItemsの編集可能なdatagridviewしか作成できないようにしました。 – user610064

+0

xsd.exeツールを使用してC#クラスファイルを生成するのが最良の方法であるため、同じXMLファイルから読み書きしているので、簡単にシリアル化してデシリアライズすることができます。 (生成されたXSDファイルにいくつかの変更を加えた後)ありがとう! – user610064

答えて

2

あなただけの最初の要素が必要な場合は、クエリを必要としない:

XElement settings = GvXMLDoc.Element("Backup").Element("Settings"); 

BackupSettings GvBackupSettings = new BackupSettings 
{ 
    IncludeDateStamp = (bool)settings.Element("IncludeDateStamp"), 
    DatePrefix = (bool)settings.Element("DatePrefix"), 
    ... 
}; 

var s = GvBackupSettings.DateSuffix; 
var t = GvBackupSettings.DateFormat; 
+0

うまくいきました。 – user610064

関連する問題