2013-05-20 615 views
6

我需要在动态XML转换为所定义的C#对象模型输入从动态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> 

我期待此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; } 
} 

我通过动态和ExpandoObject 4.0 C#去了,这种方式让我来动态获取值通过使用键。我不知道如何将这些填充到我的数据模型中。

注意:我不想定义这个类的模型结构,这不断地改变一段时间。我正在寻找一个解决方案,它允许我获得像DynamicObject.Addresses.Address [0] .City这样的值。

请给予您的意见。

+2

什么是“动态XML”?你是否尝试过LinqToXml? – mipe34

+0

我不想保持xml内容的选项卡,这不断变化。我的数据模型也应该在运行时根据输入xml动态地改变。 – KRP

+0

我已经尝试过LINQ到Xml,我无法使用数组元素。例如:地址 – KRP

回答

3

我建议你阅读这篇文章:http://www.codeproject.com/Articles/62839/Adventures-with-C-4-0-dynamic-ExpandoObject-Elasti。有一种方法可以从XML构造动态对象。 或这篇文章:http://www.codeproject.com/Articles/461677/Creating-a-dynamic-object-from-XML-using-ExpandoOb。采取任何你需要的,你可以根据你的需要定制代码。

+3

请不要添加仅链接的答案,因为链接中断时它们变得毫无用处。请在此处将相关内容添加到您的答案中,并将其与链接一起引用。 – Ren

2

检查这个例子:

 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(); 

您将获得:<City>Moscow</City>

还是看该解决方案使用DynamicObject

XElement root = XElement.Parse(xml); 
    dynamic persons = DynamicXml.Parse(xml); 
    Console.WriteLine(persons.Person.Addresses.Address[1].City); 

Deserialize XML To Object using Dynamic

6

一个解决方案使用LINQ2XML可以看看像这样S(没有所需的类):

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 
0

我创建了一个专门用于此目的的项目,因为我不满意替代方案(例如CodeProject链接到其他答案中的文章)。

我已将它贴在Github上:https://github.com/jonathanconway/XmlToDynamic

我宁可不要在这里发布的源代码,因为它太大了,但这里的用法:

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'