从动态xml转换为c#对象

从动态xml转换为c#对象,c#,.net,c#-4.0,dynamic,expandoobject,C#,.net,C# 4.0,Dynamic,Expandoobject,在将动态xml转换为定义的c#对象模型时,我需要输入 我的示例xml如下所示: <?xml version="1.0" encoding="utf-8" ?> <Persons> <Person> <Id>10</Id> <FirstName> Dino </FirstName> <LastName> Esposito </LastName>

在将动态xml转换为定义的c#对象模型时,我需要输入

我的示例xml如下所示:

<?xml version="1.0" encoding="utf-8" ?>
  <Persons>
    <Person>
      <Id>10</Id>
      <FirstName> Dino </FirstName>
      <LastName> Esposito </LastName>
      <Addresses>
        <Address>
          <AddressType>BillTo</AddressType>
          <Street1></Street1>
          <Street2></Street2>
          <Street3></Street3>
          <City>Moscow</City>
        </Address>
        <Address>
          <AddressType>ShipTo</AddressType>
          <Street1></Street1>
          <Street2></Street2>
          <Street3></Street3>
          <City>Moscow</City>
        </Address>
        <Address>
          <AddressType>Contact</AddressType>
          <Street1></Street1>
          <Street2></Street2>
          <Street3></Street3>
          <City>Moscow</City>
        </Address>
      </Addresses>
    </Person>
  </Persons>

10
恐龙
埃斯波西托
比尔托
莫斯科
希普托
莫斯科
接触
莫斯科
我希望在运行时将此xml的值转换为C#对象。 我希望定义一个类似于以下内容的对象: 我预期的类对象C#如下所示:

public class Person
{
    public int Id { get; set; }
    public String FirstName { get; set; }
    public String LastName { get; set; }
    public IList<Address> Addresses { get; set; }
}

public class Address
{
    public string AddressType { get; set; }
    public string Street1 { get; set; }
    public string Street2 { get; set; }
    public string Street3 { get; set; }
    public string City { get; set; }
}
公共类人物
{
公共int Id{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共IList地址{get;set;}
}
公共课堂演讲
{
公共字符串地址类型{get;set;}
公共字符串Street1{get;set;}
公共字符串Street2{get;set;}
公共字符串Street3{get;set;}
公共字符串City{get;set;}
}
我在C#4.0中使用了dynamic和ExpandooObject,这种方法允许我使用键动态获取值。我不知道如何将这些填充到我的数据模型中

注意:我不想定义这个类模型结构,它会随着时间的推移不断变化。我正在寻找一种解决方案,它允许我获取DynamicObject.Addresses.Address[0].City之类的值

请给出您的输入。

检查此示例:

        string xml =
            @"<?xml version='1.0' encoding='utf-8' ?>
              <Persons>
               <Person>
                <Id>10</Id>
                <FirstName> Dino </FirstName>
                <LastName> Esposito </LastName>
                <Addresses>
                  <Address>
                   <AddressType>BillTo</AddressType>
                   <Street1></Street1>
                   <Street2></Street2>
                   <Street3></Street3>
                   <City>Moscow</City>
                </Address>
                <Address>
                 <AddressType>ShipTo</AddressType>
                 <Street1></Street1>
                 <Street2></Street2>
                 <Street3></Street3>
                 <City>Moscow</City>
                </Address>
                <Address>
                  <AddressType>Contact</AddressType>
                  <Street1></Street1>
                  <Street2></Street2>
                  <Street3></Street3>
                  <City>Moscow</City>
                </Address>
             </Addresses>
            </Person>
           </Persons>";

        XElement root = XElement.Parse(xml);

        IEnumerable<XElement> list = root.XPathSelectElements("./Person/Addresses/Address[2]/City");
        foreach (XElement el in list)
            Console.WriteLine(el);
        Console.ReadLine();

使用LINQ2XML的解决方案可以如下所示(不需要类):


我建议您阅读以下文章:。有一种从XML构造动态对象的方法。
或本文:。无论您需要什么,您都可以根据自己的需要定制代码。

感谢大家的投入,我正在寻找的解决方案可以在这里找到
.

我专门为此创建了一个项目,因为我对备选方案(如其他答案中链接到的CodeProject文章)不满意

我已将其发布在Github:

我不想在这里发布源代码,因为它太大了,但下面是用法:

var xmlString =
    @"<addressBook>
       <contacts>
         <contact>
           <name>Jonathan</name>
         </contact>
       </contacts>
     </addressBook>";
var dynamicXml = XElement.Parse(xmlString).ToDynamic();
var firstPersonsName = dynamicXml.contacts[0].name.Value;
// firstPersonsName will be 'Jonathan'
var-xmlString=
@"
乔纳森
";
var dynamicXml=XElement.Parse(xmlString.ToDynamic();
var firstPersonsName=dynamicXml.contacts[0].name.Value;
//第一个人的名字是“乔纳森”

什么是“动态xml”?你试过LinqToXml吗?我不想在xml内容上留下标签,这是不断变化的。我的数据模型也应该在运行时根据输入xml动态更改。我已经尝试了linq到xml,我无法使用元素数组。ex:Addresses为什么不使用XPath查询(LINQ)XML?我个人看不出使用动态对象比定义一些类更好。如果/当数据源发生更改时,无论如何都必须重构代码。如果您有类,那么使用重构工具可以更容易地做到这一点。但那只是我的2美分。请不要添加链接答案,因为一旦链接断开,答案将变得毫无用处。请在此处将相关内容添加到您的答案中,并将其与链接一起引用。请不要添加仅链接的答案,因为如果链接中断,这些答案将变得毫无用处。请在此处将相关内容添加到您的答案中,并使用链接进行参考。
var xml = XDocument.Parse(xmlSrc); // from XML string, e.g.: <xml ...><Persons><Person>...
//var xml = XDocument.Load(xmlFile); // from XML file, e.g.: c:\temp\persons.xml

var persons = xml.Root.Elements("Person").ToList();
var p1Addresses = persons[0].Elements("Addresses").ToList();
foreach (var address in p1Addresses.Elements("Address"))
{
    var elementAddress = address.Element("AddressType");
    var elementCity = address.Element("City");
    System.Console.WriteLine(string.Format("{0} - {1}", elementAddress.Value, elementCity.Value));
}
BillTo - Moscow
ShipTo - Moscow
Contact - Moscow
var xmlString =
    @"<addressBook>
       <contacts>
         <contact>
           <name>Jonathan</name>
         </contact>
       </contacts>
     </addressBook>";
var dynamicXml = XElement.Parse(xmlString).ToDynamic();
var firstPersonsName = dynamicXml.contacts[0].name.Value;
// firstPersonsName will be 'Jonathan'