XML反序列化

6
我有以下的xml文件。
<a>
  <b>
    <c>val1</c>
    <d>val2</d>
  </b>
  <b>
    <c>val3</c>
    <d>val4</d>
  </b>
<a>

我想把这个数据反序列化成一个类,并且我想用创建的类对象访问它们。我使用的是C#语言。我已经成功地将值反序列化到了类‘a’(<a>标签)的对象中,但是如何从这个对象中访问<b>的值呢?
我的代码如下:
[Serializable()]
[XmlRoot("a")]
public class a
{
    [XmlArray("a")]
    [XmlArrayItem("b", typeof(b))]
    public b[] bb{ get; set; }
}
[Serializable()] public class b { [XmlElement("c")] public string c{ get; set; } [XmlElement("d")] public string d{ get; set; } } class Program { static void Main(string[] args) {
a i = null; string path = "test.xml";
XmlSerializer serializer = new XmlSerializer(typeof(a));
StreamReader reader = new StreamReader(path); i = (a)serializer.Deserialize(reader); reader.Close(); //i want to print all b tags here Console.Read(); } }

你能贴出获取标签的代码吗?这可能会给我们提供帮助的线索。 - Oded
如果您真的将XML反序列化为一个对象,那么它就是a.b。您有什么?也许只是一个XML文档? - Kobi
5个回答

8
为了使这个工作起来,您可以进行如下更改。
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的对象)访问<b>标签内容?我尝试了i.bb [0],但它没有起作用。 - Nave
请查看更新,其中展示了如何工作,并演示了访问 i.bb[]。 - Chris Taylor

2

0
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; }
}

0

我发现解决这个问题最简单的方法是将你的类定义 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")]


-1
将 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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接