C# 将 XML 文件解析为对象

Qua*_*nel 0 c# xml

使用C#,有没有一种方法可以轻松解析XML文件,以便将其用作对象?

XML 示例:

<Config>
    <Ui>
        <Colour>black</Colour>
        <Size>small</Size>
    </Ui>
    <Output>
        <Mode>smb</Mode>
        <Version>2</Version>
    </Output>
</Config>
Run Code Online (Sandbox Code Playgroud)

然后参考我的应用程序中的参数

Config.Output.Mode
Run Code Online (Sandbox Code Playgroud)

我尝试过这种方法 - How to Deserialize XML document

但当我尝试时

var cfg = new Config();
cfg.Load(@"config.xml");
Console.WriteLine(cfg.Output.Mode);
Run Code Online (Sandbox Code Playgroud)

Visual Studio 指示 .Output.Mode 无效。

Config.Load 所在位置

Config.Output.Mode
Run Code Online (Sandbox Code Playgroud)

Ruf*_*s L 6

您必须创建与 xml 文件中的定义匹配的类,才能将文件反序列化为该类的实例。请注意,我为属性命名的名称与 xml 文件中的名称相同。如果您想使用不同的属性名称,那么您需要在属性上方添加一个属性,指定应映射到它的 xml 元素(例如Ui,您将添加属性:[XmlElement("Ui")]).

请注意,我还重写了ToString类的方法,以便我们可以以良好的方式将它们输出到控制台:

public class Config
{
    public UI Ui { get; set; }
    public Output Output { get; set; }

    public override string ToString()
    {
        return $"Config has properties:\n - Ui: {Ui}\n - Output: {Output}";
    }
}

public class UI
{
    public string Colour { get; set; }
    public string Size { get; set; }

    public override string ToString()
    {
        return $"(Colour: {Colour}, Size: {Size})";
    }
}

public class Output
{
    public string Mode { get; set; }
    public int Version { get; set; }

    public override string ToString()
    {
        return $"(Mode: {Mode}, Version: {Version})";
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我们要做的就是创建一个StreamReader,将其指向我们的文件路径,然后使用该文件XmlSerializer的类Deserialize(将输出转换为适当的类型)到一个对象中:

static void Main(string[] args)
{
    var filePath = @"f:\private\temp\temp2.txt";

    // Declare this outside the 'using' block so we can access it later
    Config config;

    using (var reader = new StreamReader(filePath))
    {
        config = (Config) new XmlSerializer(typeof(Config)).Deserialize(reader);
    }

    Console.WriteLine(config);

    GetKeyFromUser("\n\nDone! Press any key to exit...");
}
Run Code Online (Sandbox Code Playgroud)

输出

在此输入图像描述