Member 10738387 Ответов: 3

Как читать XML с родительскими значениями родительского узла и присваивать классу свойство.


у меня есть xml, как показано ниже

<Parents>
<parent>
<child1>001</Child1>
<child2>Name1</Child2>
<child3>Address1</Child3>
<child4>Address2</Child4>
</parent>
<parent>
<child1>002</Child1>
<child2>Name2</Child2>
<child3>Address1</Child3>
<child4>Address2</Child4>
</parent>
<parent>
<child1>003</Child1>
<child2>Name3</Child2>
<child3>Address1</Child3>
<child4>Address2</Child4>
</parent>
<parent>
<child1>004</Child1>
<child2>Name4</Child2>
<child3>Address1</Child3>
<child4>Address2</Child4>
</parent>
</Parents>


и есть класс В C#, как показано ниже

public class xmldata
{
private string child1{get;set;}
private string child2{get;set;}
private string child3{get;set;}
private string child4{get;set;}
}


я хочу прочитать и присвоить все значения xml elemet списку классов, как показано ниже

List<xmldata> data1 = new List<xmldata>();


этот список должен содержать все четыре значения родительского элемента.

Что я уже пробовал:

я попытался прочитать xml с помощью Xdocument (LinQ), получив ошибку, и не смог ее достичь.

3 Ответов

Рейтинг:
2

George Swan

То, что я предлагаю вам сделать, это скачать ExtendedXmlSerializer NuGet-пакет. Создать List<XmlData> и Сериализуйте его с помощью сериализатора, а затем изучите выходные данные.

List<XmlData> parents = new List<XmlData>
{
    new XmlData{child1="A1",child2="A2",child3="A3"},
    new XmlData{child1="B1",child2="B2",child3="B3"},
    new XmlData{child1="C1",child2="C2",child3="C3"}
};
   IExtendedXmlSerializer serializer = new ConfigurationContainer().Create();
   var xml = serializer.Serialize(parents);

Выходной Xml-файл будет похож на этот.
<?xml version="1.0" encoding="utf-8"?><List xmlns:ns1="clr-namespace:XmlTest;
assembly=XmlTest" xmlns:exs="https://extendedxmlserializer.github.io/v2" exs:arguments="ns1:XmlData" xmlns="https://extendedxmlserializer.github.io/system">
<Capacity>4</Capacity>
<ns1:XmlData>
<child1>A1</child1>
<child2>A2</child2>
<child3>A3</child3>
</ns1:XmlData>
<ns1:XmlData>
<child1>B1</child1>
<child2>B2</child2>
<child3>B3</child3>
</ns1:XmlData>
<ns1:XmlData>
<child1>C1</child1>
<child2>C2</child2>
<child3>C3</child3>
</ns1:XmlData></List>

Затем вы хотите реструктурировать свои xml-данные так, чтобы они были в том же формате. То Capacity элемент может быть опущен. Если формат файла данных у вас фиксированный, вы можете реструктурировать его, загрузив в StringBuilder и использование Append и Replace методы добавления и замены имен элементов по мере необходимости.
string xmlContent = File.ReadAllText(@"C:\Temp\orig.xml");
StringBuilder sb = new StringBuilder(xmlContent).
Replace("<Parents>",xmlHeading).Replace("</Parents>","").
Replace("parent","ns1:XmlData").Append("/List>");
IExtendedXmlSerializer serializer = new ConfigurationContainer().Create();
string data = sb.ToString();
var MyXmlDataList = serializer.Deserialize<List<XmlData>>(data);


Рейтинг:
1

RickZeeland

Вы можете использовать этот трюк в Visual Studio 2017:

Перейти в меню редактирования
Выберите пункт "Вставить специальный".
Выберите пункт "Вставить XML как классы".

Убедитесь, что все имеет один и тот же случай, имя файла 'MyChildren.xml':

<parent>
<child1>001</child1>
<child2>name1</child2>
<child3>address1</child3>
<child4>address2</child4>
</parent>
<parent>
<child1>002</child1>
<child2>name2</child2>
<child3>address1</child3>
<child4>address2</child4>
</parent>
<parent>
<child1>003</child1>
<child2>name3</child2>
<child3>address1</child3>
<child4>address2</child4>
</parent>
<parent>
<child1>004</child1>
<child2>name4</child2>
<child3>address1</child3>
<child4>address2</child4>
</parent>


Пример формы использования:
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Drawing;
    using System.IO;
    using System.Text;
    using System.Windows.Forms;
    using System.Xml;
    using System.Xml.Serialization;

    public partial class Form1 : Form
    {
        /// <summary>
        /// The config for XML serialization.
        /// </summary>
        private Children childrenXml;

        public Form1()
        {
            this.InitializeComponent();
			this.SettingsRead("MyChildren.xml")
		}

        private bool SettingsRead(string fileNameFull)
        {
            bool result = false;

            try
            {
                var serializer = new XmlSerializer(this.childrenXml.GetType());
                string str = File.ReadAllText(fileNameFull);

                using (TextReader reader = new StringReader(str))
                {
                    this.childrenXml = (Children)serializer.Deserialize(reader);
                }

                result = true;
            }
            catch (Exception ex)
            {
                Debug.Print("SettingsRead() " + ex.Message);
            }

            return result;
        }
}

Файл класса:
namespace MyChildren
{
    using System.Collections.Generic;

    public class Children
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="Children"/> class.
        /// </summary>
        public Children()
        {
            this.ChildrenItemList = new List<ChildrenItem>();
        }
		
		/// <summary>
        /// Gets or sets the ChildrenItemList
        /// </summary>
        public List<ChildrenItem> ChildrenItemList { get; set; }
    }

    /// <summary>
    /// ChildrenItem subclass defines one element in the Children.
    /// </summary>
    public class ChildrenItem
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="ChildrenItem"/> class.
        /// </summary>
        public ChildrenItem()
        {
            // Only needed for serializer.
        }

        /// <summary>
        /// Initializes a new instance of the <see cref="ChildrenItem"/> class.
        /// </summary>
        public ChildrenItem(string c1, string c2, string c3, string c4)
        {
            this.Child1 = c1;
            this.Child2 = c2;
            this.Child3 = c3;
            this.Child4 = c4;
        }

        /// <summary>
        /// Gets or sets the Child(s)
        /// </summary>
        public string Child1 { get; set; }
		
		public string Child2 { get; set; }

		public string Child3 { get; set; }

		public string Child4 { get; set; }
	}
}


Рейтинг:
1

#realJSOP

Погуглите это: c# deserialize nested xml


Member 10738387

благодаря его работе я могу десериализовать и преобразовать в объекты