C# 由非技术人员创建,因此所有内容都将采用字符串格式。既然如此,我该如何解决这个问题呢?当我的第一个解决方案是LINQ to XML时,为什么这与LINQ to XML无关呢?因为这完全取决于如何解析该字符串并将其映射到部门对象的属性,而字符串解析与LINQ

C# 由非技术人员创建,因此所有内容都将采用字符串格式。既然如此,我该如何解决这个问题呢?当我的第一个解决方案是LINQ to XML时,为什么这与LINQ to XML无关呢?因为这完全取决于如何解析该字符串并将其映射到部门对象的属性,而字符串解析与LINQ ,c#,xml,linq,linq-to-xml,C#,Xml,Linq,Linq To Xml,由非技术人员创建,因此所有内容都将采用字符串格式。既然如此,我该如何解决这个问题呢?当我的第一个解决方案是LINQ to XML时,为什么这与LINQ to XML无关呢?因为这完全取决于如何解析该字符串并将其映射到部门对象的属性,而字符串解析与LINQ to XMLSo无关。因此,鉴于上述XML,我如何将其映射到我的Employee类中?这可能吗?在这种特殊情况下,这有什么帮助?如何使用XML反序列化将字符串转换为部门对象?耐心是绝地武士的主要品质。请看我的另一个答案,希望它能有所帮助,因为我


由非技术人员创建,因此所有内容都将采用字符串格式。既然如此,我该如何解决这个问题呢?当我的第一个解决方案是LINQ to XML时,为什么这与LINQ to XML无关呢?因为这完全取决于如何解析该字符串并将其映射到
部门
对象的属性,而字符串解析与LINQ to XMLSo无关。因此,鉴于上述XML,我如何将其映射到我的Employee类中?这可能吗?在这种特殊情况下,这有什么帮助?如何使用XML反序列化将字符串转换为部门对象?耐心是绝地武士的主要品质。请看我的另一个答案,希望它能有所帮助,因为我不知道您是真正的xml。无论如何,这将序列化结构,然后将其反序列化为XML,但与问题中的不同。我使用XmlSerializer序列化对象,但我像XMLDocument一样读取它们。对不起,对于我的英语,也许我遗漏了一些东西,但你们的问题是关于复杂类型的,所以我给你们一个答案。或者您只是想使用linq转换XML而不是我的方法?请看问题中的XML。每个员工都有
Department=“Finance”
,而不是整个
部门。我不是问这个问题的那个人。好吧,但他问:“…如果部门是一个复杂的对象,它是XML文件中的一个字符串…”复杂类型不能同时是一个字符串和复杂类型。如果要序列化复杂类型,它将是一个多个字符串。此外,他还说“…如何更改LoadData()函数以将其导入Employee对象集合”作者应该使用某种映射将XmlDoc转换为自己的类型。。。如果我得到更多信息,或者如果作者在特定示例下修改了我的代码,我将很乐意提供帮助。
private void LoadData()
{
   XDocument employeesDoc = XDocument.Load("Employees.xml");
   List<Employee> data = (from employee in employeesDoc.Descendants("Employee")
      select new Employee
      {
         FirstName= employee.Attribute("FirstName").Value,
         LastName = employee.Attribute("LastName ").Value,
         PhoneNumber = employee.Attribute("PhoneNumber").Value
      }).ToList();
  Employees.ItemsSource = data;
}
public class Employee
{
  public int Id { get; set; }
  public string FirstName { get; set; }
  public string LastName { get; set; }
  public string PhoneNumber { get; set; }
  public Department Department { get; set; }
}
public class Department
{
  public int Id { get; set; }
  public string Name { get; set; }
  public string Description { get; set; }
  public Employee Manager { get; set; }
}
<Employees>
    <Employee FirstName="John" LastName="Summers" PhoneNumber="703-548-7841" Department="Finance"></Employee>
    <Employee FirstName="Susan" LastName="Hughey" PhoneNumber="549-461-7962" Department="HR"></Employee>
XmlSerializer serializer = new XmlSerializer(typeof(YourType));
using (TextReader tr = new StreamReader("newSecret.xml"))
{
 YourType rrr = (YourType)serializer.Deserialize(tr);
}
var departmentsDict = departments.ToDictionary(d => d.Name);

XDocument employeesDoc = XDocument.Load("Employees.xml");
List<Employee> data = (from employee in employeesDoc.Descendants("Employee")
   select new Employee
   {
      FirstName= employee.Attribute("FirstName").Value,
      LastName = employee.Attribute("LastName ").Value,
      PhoneNumber = employee.Attribute("PhoneNumber").Value,
      Department = departmentsDict[employee.Attribute("Department").Value]
   }).ToList();
Employees.ItemsSource = data;
    using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApplication2
{

    public class Employee
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string PhoneNumber { get; set; }
        public Department Department { get; set; }
    }
    public class Department
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public Employee Manager { get; set; }
    }


    internal class Program
    {
        private static void Main(string[] args)
        {
            String filepath = @"C:\\rrrr.xml";

            #region Create Test Data
            List<Employee> list = new List<Employee>();
            for (int i = 0; i < 5; i++)
            {
                list.Add(new Employee
                             {
                                 Department = new Department
                                                  {
                                                      Description = "bla bla description " + i,
                                                      Id = i,
                                                      Manager = null,
                                                      Name = "bla bla name " + i
                                                  },
                                 FirstName = "First name " + i,
                                 Id = i + i,
                                 LastName = "Last name " + i,
                                 PhoneNumber = Guid.NewGuid().ToString()
                             });
            } 
            #endregion

            #region Save XML
            XmlSerializer serializer = new XmlSerializer(typeof(List<Employee>));
            using (Stream fs = new FileStream(filepath, FileMode.Create))
            {
                using (XmlWriter writer = new XmlTextWriter(fs, Encoding.Unicode))
                {
                    serializer.Serialize(writer, list);
                }
            } 
            #endregion


            //Read from XML

            XmlDocument doc = new XmlDocument();
            doc.Load(filepath);

            List<Employee> newList = new List<Employee>();
            foreach (XmlNode node in doc.GetElementsByTagName("Employee"))
            {
                Employee ee = GetEmploee(node);
                newList.Add(ee);
            }

            //ta da
        }

        public static Employee GetEmploee(XmlNode node)
        {
            return node == null
                       ? new Employee()
                       : new Employee
                             {
                                 Department = GetDepartment(node["Department"]),
                                 FirstName = (node["FirstName"]).InnerText,
                                 LastName = (node["LastName"]).InnerText,
                                 Id = Convert.ToInt32((node["Id"]).InnerText),
                                 PhoneNumber = (node["PhoneNumber"]).InnerText
                             };
        }

        public static Department GetDepartment(XmlNode node)
        {
            return node == null
                       ? new Department()
                       : new Department
                             {
                                 Description = node["Description"].InnerText,
                                 Id = Convert.ToInt32(node["Id"].InnerText),
                                 Manager = GetEmploee(node["Manager"]),
                                 Name = node["Name"].InnerText
                             };
        }
    }
}