【问题标题】:C# XML Document Error (2,2) deserialize xml and storing to arrayC# XML 文档错误 (2,2) 反序列化 xml 并存储到数组
【发布时间】:2015-07-28 09:19:57
【问题描述】:

目标: - 反序列化 xml 文档中的数据并将其存储为数组。 - 避免手动将数据分配给不同的字符串。 - xml文档会手动生成

public void DeserializeObject(string filename)
       {
           try
           {
               XmlSerializer deserializer = new XmlSerializer(typeof(string[]));
               FileStream fs = new FileStream(filename, FileMode.Open);
               string[] XmlData = (string[])deserializer.Deserialize(fs);

               foreach (string p in XmlData)
               {
                   Console.WriteLine(p);
               }
           }
           catch (Exception e)
           {
               Console.WriteLine(e.Message);
           }   
       }

XML文档如下

<?xml version="1.0" encoding="utf-8"?>
<Mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Products>
    <Product>
      <software>Seiko</software>
    </Product>
    <Product>
      <hardware>Martina</hardware>
    </Product>
  </Products>
</Mapping>

【问题讨论】:

  • 好吧,您的 XML 文件不是字符串数组 - 它是 List&lt;Product&gt; 或类似的序列化形式...
  • 您已将序列化程序设置为 string[] 类型。生成的反序列化 xml 将不是字符串数组。它将是一个 Mapping 类型的对象,其中包含一个 Products 对象,该对象包含一个 Product 对象数组等。您需要构建您的类。
  • 我怎样才能最好地使它成为一个数组 XML
  • @JerryMbawa XML 不能只是一个数组。必须有一个封闭类型。
  • 如果您使用的是 .Net framework 4.5,您可以按照此处的说明从 xml 生成类型。 msdn.microsoft.com/en-us/library/hh371548(v=vs.110).aspx 打开要使用代理的代码文件。此文件应该是 .NET Framework 4.5 项目的一部分。将光标放在文件中任何现有类之外的位置。选择编辑、选择性粘贴、将 XML 粘贴为类。从 xml 生成类型后,您可以使用它来反序列化您的 xml

标签: c# xml xml-deserialization


【解决方案1】:

谢谢,找到了解决办法

<?xml version="1.0" encoding="utf-8" ?>
<Locations>
  <Location Name="Location1" IP="127.0.0.1"></Location>
  <Location Name="Location2" IP="127.0.0.1"></Location>
  <Location Name="Location3" IP="127.0.0.1"></Location>
  <Location Name="Location4" IP="127.0.0.1"></Location>
  <Location Name="Location5" IP="127.0.0.1"></Location>
</Locations>


using System.Xml.Linq;

class Program
   {
       static void Main(string[] args)
       {
           string[] strarr = GetStringArray("Locations.xml");

           foreach (string str in strarr)
           {
               Console.WriteLine(str);
           }
       }

       public static string[] GetStringArray(string url)
       {
            XDocument doc = XDocument.Load(url);

           var locations = from l in doc.Descendants("Location")
                           select (string)l.Attribute("Name");

           return locations.ToArray();
       }
   }

【讨论】:

    【解决方案2】:

    试试这个

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.Xml.Linq;
    
    namespace ConsoleApplication38
    {
        class Program
        {
            static void Main(string[] args)
            {
                string input =
                "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
                "<Mapping xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" +
                  "<Products>" +
                    "<Product>" +
                      "<software>Seiko</software>" +
                    "</Product>" +
                    "<Product>" +
                      "<hardware>Martina</hardware>" +
                    "</Product>" +
                  "</Products>" +
                "</Mapping>";
    
                XDocument doc = XDocument.Parse(input);
    
                var results = doc.Descendants("Product").Select(x =>
                    x.Elements().Select(y => new { type = y.Name, value = (string)y }).ToList()
                ).SelectMany(z => z).ToList();
    
                var groups = results.GroupBy(x => x.type).ToList();
            }
        }
    }
    

    【讨论】:

    • 产品是可变的,它们将被手动添加,所以在应用程序中定义产品元素并不好,因为我想要一个产品数组
    • 产品(即硬件Martina)是否永远是Product标签之后的第一个孩子?
    • 不,它可以是任何东西,甚至可以从硬件更改为(下载 Martina),因此所有产品元素都可能发生变化,一次可能超过 2 个产品
    【解决方案3】:

    您需要从示例 XML 生成一个类。 您可以使用 xsd.exe 生成 .xsd 并从中创建 .cs 文件。

    您需要将此类型添加到您的 XmlSerializer

    看到这个答案:Generate C# class from XML

    XmlSerializer deserializer = new XmlSerializer(typeof(Mapping)); <- Created class type here.
    

    【讨论】:

      【解决方案4】:

      如果您只想从 XML 文档中获取数据作为字符串数组,您可以使用 XmlDocument 加载数据

      XmlDocument doc = new XmlDocument();
      doc.Load("file.xml");
      

      然后您可以使用 xPath 表达式找到您需要的节点:

      XmlNodeList nodelist = doc.SelectNodes(...);
      

      【讨论】:

        猜你喜欢
        • 2011-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-28
        • 1970-01-01
        • 1970-01-01
        • 2021-08-28
        相关资源
        最近更新 更多