【问题标题】:XML DeserializationXML 反序列化
【发布时间】:2011-03-03 09:55:57
【问题描述】:

我有以下 xml 文件。

<a>
  <b>
    <c>val1</c>
    <d>val2</d>
  </b>
  <b>
    <c>val3</c>
    <d>val4</d>
  </b>
<a>

我想将其反序列化为一个类,并且我想使用创建的类的对象来访问它们。我正在使用 C#。我能够反序列化并将值放入类“a”(&lt;a&gt; 标记)的对象中。但是如何从这个对象访问&lt;b&gt; 的值呢? 我做了以下编码:

[可序列化()] [XmlRoot("a")] 公开课a { [XmlArray("a")] [XmlArrayItem("b", typeof(b))] 公共 b[] bb{​​ 获取;放; } } [可序列化()] 公共B类 { [XmlElement("c")] 公共字符串 c{ 获取;放; } [XmlElement("d")] 公共字符串 d{ 获取;放; } } 课堂节目 { 静态无效主要(字符串 [] 参数) { 一世=空; 字符串路径=“test.xml”; XmlSerializer 序列化器 = 新 XmlSerializer(typeof(a)); StreamReader reader = new StreamReader(path); i = (a)serializer.Deserialize(reader); reader.Close(); //我想在这里打印所有的b标签 Console.Read(); } }

【问题讨论】:

  • 你能贴出获取标签的代码吗?可能会给我们提供帮助的线索。
  • 如果你真的将 xml 反序列化为 object,那就是a.b。你有什么?也许只是一个 XML 文档?

标签: c# xml serialization


【解决方案1】:

为此,您可以进行以下更改

public class a
{
    [XmlElement("b")]
    public b[] bb{ get; set; }
}

通过在数组上使用XmlElement 属性,您实际上是在告诉序列化程序,数组元素应该作为当前元素的直接子元素进行序列化/反序列化。

这是一个工作示例,我将 XML 放在一个字符串中只是为了使示例自包含。

using System;
using System.IO;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      string xml =
        @"<a> 
            <b> 
              <c>val1</c> 
              <d>val2</d> 
            </b> 
            <b> 
              <c>val3</c> 
              <d>val4</d> 
            </b> 
          </a>";

      XmlSerializer xs = new XmlSerializer(typeof(a));
      a i = (a)xs.Deserialize(new StringReader(xml));

      if (i != null && i.bb != null && i.bb.Length > 0)
      {
        Console.WriteLine(i.bb[0].c); 
      }
      else
      {
        Console.WriteLine("Something went wrong!"); 
      }

      Console.ReadKey();
    }
  }


  [XmlRoot("a")]
  public class a
  {    
    [XmlElement("b")]
    public b[] bb { get; set; }
  }

  public class b
  {
    [XmlElement("c")]
    public string c { get; set; }
    [XmlElement("d")]
    public string d { get; set; }
  }  
}

【讨论】:

  • 但是我如何从对象 i(它是 a 的对象)访问 标记内容?我试过 i.bb[0]。但它不起作用。
  • 请查看显示其工作原理的更新,并演示如何访问 i.bb[]。
【解决方案2】:

如果对创建 xml 序列化类有疑问,我发现解决问题的最简单方法是:

  • 将所有虚拟数据转储到 XML 文件中
  • 运行 xsd.exe 以创建 .xsd 架构文件
  • 在架构文件上运行 xsd.exe 以创建类文件

不久前,我在一篇博文中写了一篇关于它的快速教程: http://www.diaryofaninja.com/blog/2010/05/07/make-your-xml-stronglytyped-because-you-can-and-its-easy

只需不到一分钟,您就可以轻松地从那里进行调整。 XSD.exe 是你的朋友

【讨论】:

    【解决方案3】:

    我发现解决问题的最简单方法是将ab 类的定义更改为以下内容

    public class b {
        public string c { get; set; }
        public string d { get; set; }
    }
    
    [XmlRoot(Namespace="", ElementName="a")]
    public class a : List<b> { }
    

    那么你的程序就可以工作了。或者,您可以向class b 添加属性[XmlRoot (Namespace = "", ElementName = "b")]

    【讨论】:

      【解决方案4】:
      class Program
      {
          static void Main(string[] args)
          {
              string employeedata = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><tag><name>test</bar></nmae>";//demo xml data
              using (TextReader sr = new StringReader(employeedata))
              {
                  XmlSerializer serializer = new XmlSerializer(typeof(Employee));//pass type name in XmlSerializer constructor here
                  Employee response = (Employee)serializer.Deserialize(sr);
                  Console.WriteLine(response.name);
              }
      
          }
      }
      [System.Xml.Serialization.XmlRoot("tag")]
      public class Employee
      {
          public string name { get; set; }
      }
      

      【讨论】:

        【解决方案5】:

        更改 if 块(来自 Chris Tyler 的回答),如下所示。

         if (i != null && i.bb != null && i.bb.Length > 0)
                    {
                        foreach (b t in i.bb)
                        {
                            Console.WriteLine(t.c);
                            Console.WriteLine(t.d);
                        }
                    }
        

        然后它会给你以下结果:

        val1 val2 val3 val4

        【讨论】:

          猜你喜欢
          • 2012-03-04
          • 1970-01-01
          • 1970-01-01
          • 2011-05-12
          • 2011-06-24
          相关资源
          最近更新 更多