C # анализировать XML-файл для объекта - PullRequest
0 голосов
/ 26 сентября 2019

Используя C #, есть ли способ легко проанализировать XML-файл, чтобы его можно было использовать в качестве объекта?

Пример XML:

<Config>
    <Ui>
        <Colour>black</Colour>
        <Size>small</Size>
    </Ui>
    <Output>
        <Mode>smb</Mode>
        <Version>2</Version>
    </Output>
</Config>

И затем обратиться к параметрамв моем приложении

Config.Output.Mode

я пробовал этот метод - Как десериализовать XML-документ

Но когда я пытаюсь

var cfg = new Config();
cfg.Load(@"config.xml");
Console.WriteLine(cfg.Output.Mode);

Visual Studio указывает. Выходной. Неверный режим.

Где Config.Load равен

xmlData = File.ReadAllText(configPath);

            var serializer = new XmlSerializer(typeof(Config));

            using (var reader = new StringReader(xmlData))
            {
                Config result = (Config)serializer.Deserialize(reader);
            }

Ответы [ 2 ]

2 голосов
/ 26 сентября 2019

Вот классы:

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

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

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

Функция десериализации:

    public static T Deserialize<T>(string xmlString)
    {
        if (xmlString == null) return default;
        var serializer = new XmlSerializer(typeof(T));
        using (var reader = new StringReader(xmlString))
        {
            return (T) serializer.Deserialize(reader);
        }
    }

А вот рабочая версия:

        Config cfg = Deserialize<Config>(xmlString);
        Console.WriteLine(cfg.Output.Mode);          
1 голос
/ 26 сентября 2019

Необходимо создать классы, соответствующие определению в файле 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})";
    }
}

Теперь все, что нам нужно сделать, это создать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...");
}

Вывод

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...