XML到LINQ反序列化为XML文档中的对象
问题描述:
好吧,这些命名空间再一次超出了我的头。XML到LINQ反序列化为XML文档中的对象
我想要一个长的XML文档并将其反序列化为实体对象列表。这种情况下的物体就像平坦的POJO。
的XML看起来像:
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Body>
<QueryResponse xmlns="http://markets.midwestiso.org/dart/xml">
<DayAheadLMP day="2011-02-25">
<PricingNode location="AEC">
<PricingNodeHourly hour="1">
<LMP>23.1</LMP>
<MCC>-0.44</MCC>
<MLC>-0.49</MLC>
<RegMCP>0</RegMCP>
<SpinMCP>0</SpinMCP>
<SuppMCP>0</SuppMCP>
</PricingNodeHourly>
等等等等。
我已经得到了尽可能:
var repsonseXML = XDocument.Parse(CallMUI(requestXml, muiUrl));
它返回我的XML作为字符串并将其解析到XDocument对象
我想要的列表对象如下:
/// <summary>
/// There are no comments for MISO.IR.IntegrationModel.LMP_DayAhead in the schema.
/// </summary>
/// <KeyProperties>
/// Location
/// Interval
/// SyncId
/// </KeyProperties>
[global::System.Data.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName="MISO.IR.IntegrationModel", Name="LMP_DayAhead")]
[global::System.Runtime.Serialization.DataContractAttribute(IsReference=true)]
[global::System.Serializable()]
public partial class LMP_DayAhead : global::System.Data.Objects.DataClasses.EntityObject
{
/// <summary>
/// Create a new LMP_DayAhead object.
/// </summary>
/// <param name="location">Initial value of Location.</param>
/// <param name="interval">Initial value of Interval.</param>
/// <param name="lMP">Initial value of LMP.</param>
/// <param name="mLC">Initial value of MLC.</param>
/// <param name="mCC">Initial value of MCC.</param>
/// <param name="syncId">Initial value of SyncId.</param>
[global::System.CodeDom.Compiler.GeneratedCode("System.Data.Entity.Design.EntityClassGenerator", "4.0.0.0")]
public static LMP_DayAhead CreateLMP_DayAhead(string location, global::System.DateTime interval, decimal lMP, decimal mLC, decimal mCC, int syncId)
{
LMP_DayAhead lMP_DayAhead = new LMP_DayAhead();
lMP_DayAhead.Location = location;
lMP_DayAhead.Interval = interval;
lMP_DayAhead.LMP = lMP;
lMP_DayAhead.MLC = mLC;
lMP_DayAhead.MCC = mCC;
lMP_DayAhead.SyncId = syncId;
return lMP_DayAhead;
}
如何使用所有这些名称空间完成它?
答
你会想看看System.Xml.Serialization命名空间。
LMP_DayAhead dayAhead = GetDayAheadData();
var serializer = new XmlSerializer(dayAhead.GetType());
using (var writer = XmlWriter.Create("dayahead.xml"))
{
serializer.Serialize(writer, shoppingCart);
}
在命名空间方面的POCO的将不得不模仿在XML中的继承,而且我相信这是告诉序列忽略的命名空间的方式(不记得了顶我的头)
答
我想我想通了:
public static void ProcessDayAheadQuery(string requestXml, int syncEntityId, string muiUrl)
{
var repsonseXML = XDocument.Load(XmlReader.Create(CallMUIStream(requestXml, muiUrl)));
XNamespace ns = "http://schemas.xmlsoap.org/soap/envelope/";
XNamespace ns2 = "http://markets.midwestiso.org/dart/xml";
using (var db = new IntLMPDB())
{
SyncJob syncEntity =
(from s in db.SyncJob where s.SyncId == syncEntityId select s).FirstOrDefault();
DateTime rDay = DateTime.Now;
String query = String.Empty;
foreach (XElement xe in repsonseXML.Descendants(ns + "Envelope").FirstOrDefault().Descendants(ns2 + "QueryResponse").Descendants(ns2 + "DayAheadLMP"))
{
rDay = DateTime.Parse(xe.FirstAttribute.Value);
query = xe.Name.LocalName;
// string day = xe.FirstAttribute.Value;
foreach (XElement node in xe.Descendants(ns2 + "PricingNode"))
{
// string location = node.FirstAttribute.Value;
strin
foreach (XElement hourly in node.Descendants(ns2 + "PricingNodeHourly"))
{
//var newRow = new LMP_DayAhead
//{
// Location = node.FirstAttribute.Value,
// Interval = rDay.AddHours(Double.Parse(hourly.FirstAttribute.Value)),
// LMP = decimal.Parse(hourly.Descendants(ns2 + "LMP").FirstOrDefault().Value),
// MLC = decimal.Parse(hourly.Descendants(ns2 + "MLC").FirstOrDefault().Value),
// MCC = decimal.Parse(hourly.Descendants(ns2 + "MCC").FirstOrDefault().Value),
// SyncJob = syncEntity
//};
//db.AddToLMP_DayAhead(newRow);
}
}
}
db.SaveChanges();
UpdateLastDbPost(db, query, rDay);
}
}
你想在你的XML generete类的代码库? – Stecya 2011-02-25 18:19:27
是的,我想XML基本上变成了一个对象列表。 – 2011-02-25 18:23:02
然后看看这个问题(也许它是类似的)http://stackoverflow.com/questions/5118450/generate-poco-objects-from-xml-file/5118502#5118502 – Stecya 2011-02-25 18:26:37