Преобразование XmlDocument в список объектов - PullRequest
0 голосов
/ 28 октября 2019

В данный момент я конвертирую XmlDocument как строку List, но это не очень хорошее решение, потому что, если я отображаю его в ListBox, это возвращает мне встроенную строку со всеми параметрами, и мне нужно отображать только таблицу, тогда, когда она проверена, отправьте Sql Server.

Я не могу создать вспомогательный класс со свойствами, потому что параметры могут быть добавлены / удалены динамически. Я не знаю, какие именно параметры будут в файле

Вот пример XML

<TechnologyTables>
   <Tables>
      <TA_ID>3102</TA_ID>
      <TA_Name>AL000-01.50M-N2-S0</TA_Name>
      <TA_MaterialID>1</TA_MaterialID>
      <TA_ThicknessID>4</TA_ThicknessID>
      <TA_IsActive>1</TA_IsActive>
      <TA_ArchiveID>100</TA_ArchiveID>
      <TA_IsArchive>0</TA_IsArchive>
      <CL_IsActive>1</CL_IsActive>
      <MP_Lens>200</MP_Lens>
      <MP_Nozzle>4.0</MP_Nozzle>
      <MP_Focal>-0.6</MP_Focal>
      <MP_NozzleDist>1.5000000e+000</MP_NozzleDist>
      <MP_GasStabilization>1</MP_GasStabilization>
      <MP_SensitiveSensor>1</MP_SensitiveSensor>
      <MP_SensitiveArea>2.5000000e+001</MP_SensitiveArea>
      <GA_ID>1</GA_ID>
      <GP_ID>0</GP_ID>
      <GP_FlushOn>1</GP_FlushOn>
      <GP_FlushTime>2000</GP_FlushTime>
      <GP_FlushPressure>1.0000000e+001</GP_FlushPressure>
      <GP_FeedbackOn>1</GP_FeedbackOn>
      <GP_FeedbackTime>0</GP_FeedbackTime>
      <GP_FeedbackPressure>1.0000000e-001</GP_FeedbackPressure>
      <GP_MaxPressure>1.0000000e+001</GP_MaxPressure>
      <GP_ContinueOn>0</GP_ContinueOn>
      <GP_ContinueTime>0</GP_ContinueTime>
      <TA_Jerk>100</TA_Jerk>
      <TA_Acceleration>100</TA_Acceleration>
      <TA_CuttingTechID>3</TA_CuttingTechID>
      <TA_FlyCut>1</TA_FlyCut>
      <TA_HeadID>1</TA_HeadID>
      <TA_MachineID>3</TA_MachineID>
      <TA_TypeID>1</TA_TypeID>
      <TT_HeadPowerID>7</TT_HeadPowerID>
      <TA_CreateDate>2019-08-26T17:10:59.810</TA_CreateDate>
      <Description>AL1.5 CATLINE</Description>
      <TA_HeadTypeID>2</TA_HeadTypeID>
      <CatlineFolder>1</CatlineFolder>
      <NozzleNameID>10</NozzleNameID>
      <LaserTypeID>1</LaserTypeID>
   </Tables>
</TechnologyTables>

Какой-то код при импорте файла

private async void _ImportTechTables()
{
    var open = new OpenFileDialog();
    var TableXml = new XmlDocument();
    open.Filter = "xml files |*.xml";
    if (open.ShowDialog() == DialogResult.OK)
    {
        TableXml.Load(open.FileName);
    }
    RSA rsaKey = GetKey();
    DecryptXML(TableXml, rsaKey, "XmlKey");

    if (TableXml != null)
    {
        var import = new TechnologyTableImportViewModel();
        List<string> xmlNodeLists = new List<string>();
        XmlNodeList node = TableXml.SelectNodes("TechnologyTables/Tables");
        foreach (XmlNode nodes in node)
        {
            xmlNodeLists.Add(nodes.InnerXml);
        }
        import.List = xmlNodeLists;

И элемента в спискевыглядеть так:

<Tables><TA_ID><Tables><TA_ID>3102</TA_ID><TA_Name>AL000-01.50M-N2<TA_Name>

Ответы [ 2 ]

2 голосов
/ 28 октября 2019

Мне нравится использовать словарь и создавать словарь, используя xml linq:

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


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

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

Если у вас несколько таблиц, используйте следующее:

            List<Dictionary<string, string>> dict = doc.Descendants("Tables").Select(t => t.Elements()
                .GroupBy(x => x.Name.LocalName, y => (string)y)
                .ToDictionary(x => x.Key, y => y.FirstOrDefault())
                ).ToList();
0 голосов
/ 28 октября 2019

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

var doc = XDocument.Parse(yourXmlFile);
var table = doc.XPathSelectElement("TechnologyTables/Tables");

var dict = new Dictionary<string, string>();

foreach (var element in table.Elements())
{
    dict.Add(element.Name.LocalName, element.Value);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...