2013-05-20 8 views
6

ho bisogno di ingressi in conversione di un XML dinamico definito C# modello a oggetticonvertire da XML dinamico C# oggetto

mio XML di esempio è il seguente:

<?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> 

mi aspetto i valori di questo XML essere convertiti in oggetto C# in fase di esecuzione. vorrei un oggetto simile al seguente da definire: mio Attesa oggetto di classe C# è la seguente:

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

ho passato dinamico e ExpandoObject in C# 4.0, questo approccio sta permettendo me per ottenere i valori in modo dinamico usando i tasti. Non so come posso popolare questi alla mia datamodel.

Nota: Non voglio definire questa struttura del modello di classe, questo continua a cambiare per un periodo di tempo. Sto cercando una soluzione che mi permetta di ottenere valori come DynamicObject.Addresses.Address [0] .City.

Gentilmente dai i tuoi input.

+2

Che cosa è "xml dinamico"? Hai provato ad es. LinqToXml? – mipe34

+0

Non voglio tenere il passo sui contenuti xml, questo continua a cambiare. la mia datamodel dovrebbe anche cambiare dinamicamente basandosi su input xml su runtime. – KRP

+0

Ho provato linq a Xml, non sono in grado di lavorare con array di elementi. ex: indirizzi – KRP

risposta

3

vorrei suggerire di leggere questo articolo: http://www.codeproject.com/Articles/62839/Adventures-with-C-4-0-dynamic-ExpandoObject-Elasti. C'è un modo per costruire oggetti dinamici da XML. O questo articolo: http://www.codeproject.com/Articles/461677/Creating-a-dynamic-object-from-XML-using-ExpandoOb. Prendi tutto ciò di cui hai bisogno e personalizza il codice per le tue esigenze.

+3

Si prega di non aggiungere risposte di solo collegamento in quanto diventano inutili in caso di interruzione del collegamento. Aggiungi qui il contenuto pertinente alla tua risposta e fai riferimento al link. – Ren

2

Controllare questo esempio:

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

otterrete: <City>Moscow</City>

O guardare a questa soluzione utilizzando 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

Una soluzione che utilizza LINQ2XML può guardare come quello s (senza classi necessarie):

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

l'output è:

BillTo - Moscow 
ShipTo - Moscow 
Contact - Moscow 
0

Ho creato un progetto appositamente per questo scopo, in quanto non ero soddisfatto delle alternative (come ad esempio l'articolo CodeProject collegato in altre risposte).

L'ho pubblicato su Github: https://github.com/jonathanconway/XmlToDynamic.

avrei preferito non pubblicare il codice sorgente qui, come è troppo grande, ma qui è l'utilizzo:

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'