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
};
}
}
}