C#:
XmlDeserialize<C, Cs>(rdr["Cs"]))
public List<T> XmlDeserialize<T, TList>(string xmlString)
{
var results = new List<T>();
if (!string.IsNullOrEmpty(xmlString))
{
XmlSerializer xs = new XmlSerializer(typeof(TList));
XmlTextReader reader = new XmlTextReader(new System.IO.StringReader(xmlString));
results = (List<T>)xs.Deserialize(reader);
}
return results;
}
[XmlType("C")]
public class C
{
public string CId { get; set; }
}
[Serializable()]
[XmlRoot("ROOT")]
public class Cs:List<C>
{
}
sql:
select name,(select cid from tb1 For XML PATH('Contacts'),ROOT('ROOT'))xmlrow from tb
<ROOT>
<Cs><CId>1</CId></Cs>
<Cs><CId>2</CId></Cs>
</ROOT>
--------------------
[Serializable()]
public class Car
{
[System.Xml.Serialization.XmlElement("StockNumber")]
public string StockNumber { get; set; }
[System.Xml.Serialization.XmlElement("Make")]
public string Make { get; set; }
[System.Xml.Serialization.XmlElement("Model")]
public string Model { get; set; }
}
[Serializable()]
[System.Xml.Serialization.XmlRoot("CarCollection")]
public class CarCollection
{
[XmlArray("Cars")]
[XmlArrayItem("Car", typeof(Car))]
public Car[] Car { get; set; }
}
The Deserialize function:
CarCollection cars = null;
string path = "cars.xml";
XmlSerializer serializer = new XmlSerializer(typeof(CarCollection));
StreamReader reader = new StreamReader(path);
cars = (CarCollection)serializer.Deserialize(reader);
reader.Close();
And the slightly tweaked xml (I needed to add a new element to wrap <Cars>...Net is picky about deserializing arrays):
<?xml version="1.0" encoding="utf-8"?>
<CarCollection>
<Cars>
<Car>
<StockNumber>1020</StockNumber>
<Make>Nissan</Make>
<Model>Sentra</Model>
</Car>
<Car>
<StockNumber>1010</StockNumber>
<Make>Toyota</Make>
<Model>Corolla</Model>
</Car>
<Car>
<StockNumber>1111</StockNumber>
<Make>Honda</Make>
<Model>Accord</Model>
</Car>
</Cars>
</CarCollection>