6

我需要输入将动态 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; }
}

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

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

请提供您的意见。

4

5 回答 5

6

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

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
于 2013-05-20T13:35:00.210 回答
4

我建议您阅读这篇文章: 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。随心所欲,您可以根据需要自定义代码。

于 2013-05-20T14:03:02.017 回答
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);

使用动态将 XML 反序列化为对象

于 2013-05-20T13:21:08.590 回答
1

感谢大家的投入,我正在寻找的解决方案可在此位置 http://www.codeproject.com/Tips/227139/Converting-XML-to-an-dynamic-object-using-ExpandoO获得。

于 2013-05-20T14:04:06.707 回答
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'
于 2013-06-22T19:40:48.093 回答