通过LINQ从XML文档填充自定义List子类

我已经想出如何从XML数据填充自定义类,但我遇到了一个问题。 事情与我现有的填充数据的方法完美配合,直到我被抛出一点曲线球。 我发送的新架构与此类似:

 1320691307345 0 8.2784   001134 USA 47.000 EA   006817 USA 20.000 EA      

非常标准的XML架构,问题是我不知道如何用它填充我的自定义类。 这是我的所作所为:

 static void Main(string[] args) { var order = ConvertXMLMessage(request); } protected static T ConvertXMLMessage(String xmlData) where T : class, new() { var xml = new XmlDocument(); xml.LoadXml(xmlData); var serializer = new System.Xml.Serialization.XmlSerializer(typeof(T)); using (var xmlReader = new XmlNodeReader(xml.DocumentElement)) { T work = (T)(serializer.Deserialize(xmlReader)); return work; } } public class ItemReply { [XmlElement("ITEM_REPLY")] public ItemAvlReply ITEM_REPLY { get; set; } } public class ItemAvlReply { [XmlElement("TRAN_ID")] public string TRAN_ID { get; set; } [XmlElement("REPLY_CODE")] public string REPLY_CODE { get; set; } [XmlElement("UNIT_PRICE")] public string UNIT_PRICE { get; set; } [XmlElement("SUP_LOCS")] public SupplierLocations SUP_LOCS; [XmlElement("MESSAGE")] public string MESSAGE { get; set; } [XmlElement("QTY_BREAKS")] public string QTY_BREAKS { get; set; } } public class SupplierLocations { [XmlElement("SUP_LOC")] public List SUP_LOC; } public class SupplierLocation { [XmlElement("SUP_LOC_ID")] public string SUP_LOC_ID { get; set; } [XmlElement("COUNTRY_ID")] public string COUNTRY_ID { get; set; } [XmlElement("QTY_AVL")] public string QTY_AVL { get; set; } [XmlElement("ITEM_UOM")] public string ITEM_UOM { get; set; } } 

这完全取决于List部分。 我对LINQ没有过多的经验,我不知道如何通过这个语句在我的类中声明一个子数组。 我也对创建List部分采取了不同的方法,我只是不确定从哪里开始。 对于我需要做的事情,有没有更好的方法? 有一个简单的解决方案,我只是在LINQ中没有意识到?

假设您提供的示例XML文件有拼写错误,这是一种简单的方法。 我假设OrderId有一个结束标记,而Items的结束标记应该是/Items

这是我使用的xml的版本:

  123 1   Test Red   Test1 Blue    

这是读取/写入XML的代码:( xml变量是一个String)

 var order = ConvertXMLMessage(xml); WriteXMLFile(order, @"test.xml"); 

这是ConvertXMLMessage和WriteXMLFile函数:

 protected static T ConvertXMLMessage(String xmlData) where T : class, new() { var xml = new XmlDocument(); xml.LoadXml(xmlData); var serializer = new System.Xml.Serialization.XmlSerializer(typeof(T)); using (var xmlReader = new XmlNodeReader(xml.DocumentElement)) { T work = (T)(serializer.Deserialize(xmlReader)); return work; } } protected static void WriteXMLFile(T item, String saveLocation) where T : class, new() { System.Xml.Serialization.XmlSerializer writer = new System.Xml.Serialization.XmlSerializer(typeof(T)); System.IO.StreamWriter file = new System.IO.StreamWriter(saveLocation); writer.Serialize(file, item); file.Close(); } 

这是类结构:

 public class Order { [XmlElement("TransactionID")] public string TransactionId { get; set; } [XmlElement("OrderID")] public string OrderId { get; set; } [XmlElement("Items")] public ItemsContainer Items; } public class ItemsContainer { [XmlAttribute("Number")] public Int32 Number { get; set; } [XmlElement("Item")] public List Items; } public class Item { [XmlElement("ItemName")] public string ItemName { get; set; } [XmlElement("Color")] public string Color { get; set; } } 

正如您将注意到的那样,我添加了一些属性,让XML解析器知道如何在从XML转换到XML时处理该类。 我还添加了另一个名为“ItemsContainer”的小类,只是为了保存Items标签的详细信息。 如果您不需要“Number”属性,那么您可能会找到一种方法来消除它。 但是,这应该让你朝着正确的方向前进。

我提供的示例是我通常处理这种情况的简单版本,显然您可以根据需要进行一些改进。

编辑我将Item类更改为使用ItemName而不是TransactionId 。 这是对我的疏忽。

编辑2这是您需要对新发布的代码进行的更正。 Order类在前一个示例中工作的原因是它与根XML元素匹配。 您是新的XML确实与基类对齐。 因此,我们需要添加更多属性才能实现这一目标。 您也可以删除ItemReply类。 这不是必需的。

所以这是新课程:

 [XmlRoot("ITEM_REPLY")] public class ItemAvlReply { [XmlElement("TRAN_ID")] public string TRAN_ID { get; set; } [XmlElement("REPLY_CODE")] public string REPLY_CODE { get; set; } [XmlElement("UNIT_PRICE")] public string UNIT_PRICE { get; set; } [XmlElement("SUP_LOCS")] public SupplierLocations SUP_LOCS; [XmlElement("MESSAGE")] public string MESSAGE { get; set; } [XmlElement("QTY_BREAKS")] public string QTY_BREAKS { get; set; } } public class SupplierLocations { [XmlElement("SUP_LOC")] public List SUP_LOC; } public class SupplierLocation { [XmlElement("SUP_LOC_ID")] public string SUP_LOC_ID { get; set; } [XmlElement("COUNTRY_ID")] public string COUNTRY_ID { get; set; } [XmlElement("QTY_AVL")] public string QTY_AVL { get; set; } [XmlElement("ITEM_UOM")] public string ITEM_UOM { get; set; } } 

其他一切都应该保持不变。 解析/转换XML到类应该没有任何更改。