簡體   English   中英

從對話框中請求的C#中的XML文件中獲取信息

[英]Get information from XML file in C# requested in dialog

我正在嘗試解析/獲取保存設置值的XML文件的信息。

我想打開一個對話框,用戶可以在其中選擇.xml文件,然后獲取信息並加載設置。

XML文件如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<Configuration version="1.2" createDate="2018-07-17T10:00:00">
    <AutoScale>1</Autoscale>
    <Threshold>2142</Threshold>
    <MinAuto>14</MinAuto>
    <MinMan>1</MinMan>
    <MaxMan>1</MaxMan>
    <BlueBackground>1</BlueBackground>
    <Contour>1</Contour>
    <Rotate>180</Rotate>
    <Flip>Vertical</Flip>
</Configuration>

我的代碼(在C#中)如下所示:

using (var openFileDialogXML = new OpenFileDialog()){
      System.IO.Stream myStream = null;
      openFileDialogXML.InitialDirectory = @System.Environment.CurrentDirectory;
      openFileDialogXML.Filter = "xml files (*.xml)|*.xml|All files (*.*)|*.*";
      openFileDialogXML.FilterIndex = 1;
      openFileDialogXML.RestoreDirectory = true;

      DialogResult dr = openFileDialogXML.ShowDialog();

      if (dr == System.Windows.Forms.DialogResult.OK)
      {
            using (XmlReader reader = XmlReader.Create(openFileDialogXML.FileName))
            {
                 reader.MoveToContent();
                 var version = reader.GetAttribute("version");
                 while (reader.Read())
                 {
                     if (reader.NodeType == XmlNodeType.Element)
                     {
                          switch (reader.Name)
                          {
                               case "AutoScale":
                                    //Get AutoScale value
                                    break;
                               case "Threshold":
                                    break;
                               case "MinAuto":
                                    break;
                               case "MinMan":
                                    break;
                               case "MaxMan":
                                    break;
                               }

                            }
                        }
                    }

我願意使用任何解析器,但我想逐個閱讀它,因為將來可能會添加新的設置。

您能幫我/給我一些有關如何實現此建議的建議嗎?

我喜歡使用Xml Linq並將結果放入字典中,因此當添加新項目時,xml解析器不必更改:

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

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

            Dictionary<string, string> dict = doc.Element("Configuration").Elements()
                .GroupBy(x => x.Name.LocalName, y => (string)y)
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());

        }
    }
}

我建議使用DataContract並將XML加載到指定的對象中。 當您的配置文件更改時,您還需要更新實體。

[DataContract]
public class MyXmlClass
{
    [DataMember]
    public int PropertyToSerialize { get; set; }
}

然后,您可以按照此處所述使用DataContractSerializer - https://docs.microsoft.com/zh-cn/dotnet/framework/wcf/feature-details/serialization-and-deserialization

與使用對象相比,使用對象要容易得多:)

如果您想手動解析它,可以使用一些快速而骯臟的答案:

using System.Xml;

[...]

XmlTextReader xtr = new XmlTextReader(GetResourceStream("config.xml"));
while (xtr.Read())
{
if (xtr.AttributeCount == 0)
    continue;

if (xtr.LocalName == "Configuration")
{
    string version = xtr.GetAttribute("version");
    string date = xtr.GetAttribute("createDate");
    Console.WriteLine($"version={version} - date = {date}")
}
else if (xtr.LocalName == "AutoScale")
{
    string autoscale = xtr.ReadString();
    Console.WriteLine($"autoscale={autoscale}")
}

[...]

}
xtr.Close();

我沒有嘗試過代碼,如果您需要更多的內容,可以先看XmlTextReader示例或文檔(stackoverflow應該有很多)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM