0

LINQ を使用して XDocument から ac# クラスに XML 要素を読み込む方法。設定が繰り返されず、XML で 1 回だけ発生するため、XDocument.Descendants を使用したくありません。

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

コード

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 を逆シリアル化しようとしています (アイデアに感謝します)。したがって、各項目をキャストする必要はありません。これは機能しません..XSDツールを実行したり、巨大なクラスファイルを持ったりする必要はありません...

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

EDIT 2 以下に示すように、標準の XSD.exe ツールを使用して c# クラスを生成することで、xml をシリアル化および逆シリアル化することになりました。特に、同じxmlファイルを読み書きする必要があったためです。注: 最初に、生成された xsd ファイルを確認/変更してください。

4

1 に答える 1

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;
于 2012-05-03T14:42:08.227 に答える