使用具有高度嵌套的XML

时间:2015-06-06 18:12:56

标签: c# xml wpf linq

我有需要加载和创建类对象的xml文件,但是,这些文件是格式化的,在我看来是一种可笑的嵌套方式。遗憾的是,我无法重新格式化xml文件。这是它们的样子(假设每个客户只有一个购买条目,并且名称可以作为密钥):

<root>
<start>
   <customer>
      <store store = "a">
          <customer name = "Ted Johnson">
             <product product = "shampoo">
                <price price = "10">
                </ price>
             </ product>
          </customer>
       </store>
       <store store = "b">
           <customer name = "Janet Henry">
             <product product = "soda">
                <price price = "2">
                </ price>
             </ product>
          </ customer>
       </ store>
   </ customer>

   <tax>
      <store store = "a">
          <customer name = "Ted Johnson">
             <product product = "shampoo">
                <tax tax = "1">
                  <date date = "4/4/2014">
                  </date>
                </tax>
             </ product>
          </customer>
       </store>         
      <store store = "b">
          <customer name = "Janet Henry">
             <product product = "soda">
                <tax tax = "0.2">
                  <date date = "5/5/2014">
                  </date>
                </tax>
             </ product>
          </customer>
       </store>
   </tax>
</ start>
</ root>

现在我需要根据这种怪物在c#/ WPF中创建类对象。我一直在尝试一些事情,但一直遇到障碍,我担心我可能最终花费很长时间来强制实施一个效率低下的解决方案。有没有一种简单的方法来解决这个问题?

我的目标是创建如下内容:

var customerPurchases = (from e in xml.Descendants(ns + "start")                         
   select new customerPurchase
   {
     name = e.Attribute("name").Value,
     store = e.Attribute("store").Value,
     product = e.Attribute("product").Value,
     price = e.Attribute("price").Value,
     tax = e.Attribute("tax").Value,
     date = e.Attribute("date").Value,  

}).ToList();

非常感谢任何有关这一混乱的帮助或见解!

3 个答案:

答案 0 :(得分:2)

您可以将XML字符串(或文件)反序列化为C#对象。 在此处查找示例:https://blog.udemy.com/csharp-serialize-to-xml/

首先,您必须拥有与XML相关联的类。要创建类,请选择XML示例数据,然后在Visual Studio中转到Edit / Paste Special / Paste XML As Classes

接下来,使用此示例。

        String xData = System.IO.File.ReadAllText(@"C:\Temp\MyFile.xml");
        XmlSerializer x = new XmlSerializer(typeof(root));
        root dataConverted = (root)x.Deserialize(new StringReader(xData));
        // root object contains all XML data.

答案 1 :(得分:0)

如果您对速度不太担心,我会使用LINQ to XML。

请参阅LINQ to XML Overview

答案 2 :(得分:0)

我会尝试将XML转换为动态C#对象。然后,将动态数据读入强类型POCO类的代码将更简洁,更容易编写。

请参阅Converting XML to a dynamic C# object

提示:如果将整个解析器包装在try / catch中,则可以检测XML输入的模式与使用动态的解析代码之间的任何不匹配,而无需关闭整个应用程序。