Структура в XML C # WinForms - PullRequest
0 голосов
/ 10 декабря 2018

Я использую структуру для хранения и доступа ко всем моим входным переменным, которые я получу от пользователя.Я должен взять 22 ввода от пользователя и сохранить его в файл и снова прочитать из файла и загрузить в форму.Я хочу сохранить эту структуру в XML.К сожалению, я не могу этого сделать, так как я новичок в c #.

struct CellModel
        {
            public string cellName;
            public double cellAh;
            public double cellNominalVoltage;
            public double cellInternalResistance;

            public double cylDeg05C25D;
            public double cylDeg10C25D;
            public double cylDeg20C25D;
            public double cylDeg05C35D;
            public double cylDeg10C35D;
            public double cylDeg20C35D;
            public double cylDeg05C45D;
            public double cylDeg10C45D;
            public double cylDeg20C45D;

            public double calDeg1stY25D;
            public double calDeg2ndY25D;
            public double calDeg3rdY25D;
            public double calDeg1stY35D;
            public double calDeg2ndY35D;
            public double calDeg3rdY35D;
            public double calDeg1stY45D;
            public double calDeg2ndY45D;
            public double calDeg3rdY45D;

        }

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Сериализация XML имеет много движущихся частей, которые вы должны получить правильно.Я предлагаю читать онлайн на C # жемчужинах на других ресурсах о том, как это сделать.

Я сделал пример приложения, которое читает XML-файл из MyDocuments и отображает данные, а также записывает данные, когдаформа закрывается.

scr1

Код, который считывает и записывает все данные:

public class SampleData
{
    public SampleData()
    {
        this.Cells = new List<CellModel>();
    }
    public SampleData(params CellModel[] data) : this()
    {
        this.Cells.AddRange(data);
    }
    [XmlArrayItem("Cell")]
    public List<CellModel> Cells { get; set; }

    public string ToXml()
    {
        var ms = new System.IO.StringWriter();
        var settings = new XmlWriterSettings()
        {
            OmitXmlDeclaration = true,
            Indent = true,
            CloseOutput = true,
            NewLineOnAttributes = false,
        };
        var fs = XmlWriter.Create(ms, settings);
        var tool = new XmlSerializer(typeof(SampleData));
        tool.Serialize(fs, this);
        fs.Close();
        return ms.ToString();
    }

    public static SampleData FromXml(string xml)
    {
        var ms = new StringReader(xml);
        var fs = XmlReader.Create(ms);
        var tool = new XmlSerializer(typeof(SampleData));
        var data = tool.Deserialize(fs) as SampleData;
        return data;
    }
}

public struct CellModel
{
    public string CellName { get; set; }
    public double CellAh { get; set; }
    public double CellNominalVoltage { get; set; }
    public double CellInternalResistance { get; set; }

    public double CylDeg05C25D { get; set; }
    public double CylDeg10C25D { get; set; }
    public double CylDeg20C25D { get; set; }
    public double CylDeg05C35D { get; set; }
    public double CylDeg10C35D { get; set; }
    public double CylDeg20C35D { get; set; }
    public double CylDeg05C45D { get; set; }
    public double CylDeg10C45D { get; set; }
    public double CylDeg20C45D { get; set; }

    public double CalDeg1stY25D { get; set; }
    public double CalDeg2ndY25D { get; set; }
    public double CalDeg3rdY25D { get; set; }
    public double CalDeg1stY35D { get; set; }
    public double CalDeg2ndY35D { get; set; }
    public double CalDeg3rdY35D { get; set; }
    public double CalDeg1stY45D { get; set; }
    public double CalDeg2ndY45D { get; set; }
    public double CalDeg3rdY45D { get; set; }
}

Сгенерированный XML-файл выглядит следующим образомthis:

<SampleData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Cells>
    <Cell>
      <CellName>SampleCell</CellName>
      <CellAh>2600</CellAh>
      <CellNominalVoltage>12</CellNominalVoltage>
      <CellInternalResistance>0.055</CellInternalResistance>
      <CylDeg05C25D>0.72634</CylDeg05C25D>
      <CylDeg10C25D>0.38927</CylDeg10C25D>
      <CylDeg20C25D>0.42383</CylDeg20C25D>
      <CylDeg05C35D>0.22634</CylDeg05C35D>
      <CylDeg10C35D>0.58927</CylDeg10C35D>
      <CylDeg20C35D>0.23831</CylDeg20C35D>
      <CylDeg05C45D>0.26342</CylDeg05C45D>
      <CylDeg10C45D>0.89275</CylDeg10C45D>
      <CylDeg20C45D>0.23831</CylDeg20C45D>
      <CalDeg1stY25D>0.92834</CalDeg1stY25D>
      <CalDeg2ndY25D>0.28345</CalDeg2ndY25D>
      <CalDeg3rdY25D>0.83443</CalDeg3rdY25D>
      <CalDeg1stY35D>0.29834</CalDeg1stY35D>
      <CalDeg2ndY35D>0.82345</CalDeg2ndY35D>
      <CalDeg3rdY35D>0.38443</CalDeg3rdY35D>
      <CalDeg1stY45D>0.39284</CalDeg1stY45D>
      <CalDeg2ndY45D>0.42835</CalDeg2ndY45D>
      <CalDeg3rdY45D>0.48343</CalDeg3rdY45D>
    </Cell>
  </Cells>
</SampleData>

Чтобы все это работало, вам нужно иметь свои данные в свойствах с геттерами и сеттерами, и вам нужен конструктор без параметров в классе, который содержит все данные.

Я использовал привязку данных в своей форме, и код, который читает при загрузке и пишет при закрытии,

public string DataPath => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "UserData.xml");

public CellModel Current
{
    get => (CellModel)cellModelBindingSource.Current;
}
protected override void OnLoad(EventArgs e)
{
    if(File.Exists(DataPath))
    {
        var xml = File.ReadAllText(DataPath);
        var sample = SampleData.FromXml(xml);
        this.cellModelBindingSource.DataSource = sample.Cells;
        MessageBox.Show($"Data read from {DataPath}");
    }            
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    var data = this.cellModelBindingSource.DataSource as DataModel[]
    var sample = new SampleData(data);
    File.WriteAllText(this.DataPath, sample.ToXml());
    MessageBox.Show($"Data written to {DataPath}");
}
0 голосов
/ 10 декабря 2018

Попробуйте следующее:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
namespace ConsoleApplication91
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            RootCell rootCell = new RootCell() {
                cells = new List<Cell>() {
                    new Cell() { cellName = "123"},
                    new Cell() { cellName = "456"}
                }
            };

            rootCell.Serialize(FILENAME, rootCell);
            RootCell readCells = rootCell.Deserialize(FILENAME);



        }
    }
    public class RootCell
    {
        [XmlElement("cells")]
        public List<Cell> cells { get; set; }

        public void Serialize(string filename, RootCell cells)
        {
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            XmlWriter writer = XmlWriter.Create(filename, settings);
            XmlSerializer serializer = new XmlSerializer(typeof(RootCell));

            serializer.Serialize(writer, cells);
            writer.Flush();
            writer.Close();
        }
        public  RootCell Deserialize(string filename)
        {
            XmlReader reader = XmlReader.Create(filename);
            XmlSerializer serializer = new XmlSerializer(typeof(RootCell));
            return (RootCell)serializer.Deserialize(reader);
        }


    }
    public class Cell
    {
        public string cellName { get; set; }
        public double cellAh { get; set; }
        public double cellNominalVoltage { get; set; }
        public double cellInternalResistance { get; set; }

        public double cylDeg05C25D { get; set; }
        public double cylDeg10C25D { get; set; }
        public double cylDeg20C25D { get; set; }
        public double cylDeg05C35D { get; set; }
        public double cylDeg10C35D { get; set; }
        public double cylDeg20C35D { get; set; }
        public double cylDeg05C45D { get; set; }
        public double cylDeg10C45D { get; set; }
        public double cylDeg20C45D { get; set; }

        public double calDeg1stY25D { get; set; }
        public double calDeg2ndY25D { get; set; }
        public double calDeg3rdY25D { get; set; }
        public double calDeg1stY35D { get; set; }
        public double calDeg2ndY35D { get; set; }
        public double calDeg3rdY35D { get; set; }
        public double calDeg1stY45D { get; set; }
        public double calDeg2ndY45D { get; set; }
        public double calDeg3rdY45D { get; set; }


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