none
如何反序列化下面的XML RRS feed

  • 问题

  • <?xml version="1.0" encoding="utf-8"?>
      <Drivers>
        <Driver>
          <Name>xxxxx</Name>
          <Space>0</Space>
        </Driver>
        <Driver>
          <Name>xxxxx</Name>
          <Space>0</Space>
        </Driver>
     
      <test></test>
      <a>OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!</a>
    </Drivers>

    [Serializable]
        public class Driver
        {
            string _name;
            int _space;
            [XmlElement(ElementName = "Name")]
            public string Name
            {
                get { return _name; }
                set { _name = value; }
            }
            [XmlElement(ElementName = "Space")]
            public int Space
            {
                get { return _space; }
                set { _space = value; }
            }
        }
        [Serializable]
        public class Drivers
        {
            [XmlElement(ElementName="test")]
            public string Test
            {
                get ;
                set;
            }
            [XmlElement(ElementName="a")]
            public string A
            {
                get;
                set ;
            }
            [XmlArray(ElementName="Drivers")]
            [XmlArrayItem(ElementName="Driver",Type=typeof(Driver))]
            public Driver[] GetDrivers;
           
        }
      System.IO.TextReader reader = new System.IO.StreamReader(AppDomain.CurrentDomain.BaseDirectory + "config.xml");
                System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(Configs));
                Configs drs = (Configs)ser.Deserialize(reader);
                reader.Dispose();

    这样做是不行的,除非是<Drivers><Drivers></Drivers></Drivers>这样的结构。
    不知道该怎么样写才行。在不改动XML的情况下。

    2009年10月6日 8:00

答案

  • 同意.
    public class Drivers
    {
     
     public DriverCollection driver;
     public string test;
     public string a;

     public Drivers()
     {
      driver = new DriverCollection();
      driver.Add(new Driver());
      driver.Add(new Driver());
      test = "";
      a = "OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!";
     }
     
    }
    public class DriverCollection : Collection<Driver>
    {

    }
    public class Driver
    {
     private string name;

     public string Name
     {
      get { return name; }
      set { name = value; }
     }
     private int space;

     public int Space
     {
      get { return space; }
      set { space = value; }
     }

     public Driver()
     {
      name = "XXXX";
      space = 0;
     }

    序列化后结果如下:
    <Drivers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">

    <driver>
    <Driver>
      <Name>XXXX</Name>
      <Space>0</Space>
      </Driver>
    <Driver>
     <Name>XXXX</Name>
      <Space>0</Space>
      </Driver>
      </driver>
      <test />
      <a>OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!</a>
      </Drivers>

    Gao Peter
    • 已建议为答案 Petergao 2009年11月4日 4:59
    • 已标记为答案 male110 2009年11月4日 9:46
    2009年11月4日 4:10

全部回复

  • 你好 对于你这种情况,建议采用实现了ICollection<T>的类如List<Driver>直接反串行化而不要自己定义类


    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年10月7日 8:34
    版主
  • 不懂,说明一下。
    写个例子。
    2009年10月7日 10:03
  • 对啊, 怎么样写呢! 请说的详细点!
    Gao Peter
    2009年11月3日 8:30
  • 这样修改就行了,其它不动,

    [XmlElement(ElementName = "Driver")]
    public Driver[] GetDrivers;


    [XmlArray(ElementName="Drivers")]
    会在Driver节点外再套一个Drivers节点,这就和你的xml不一样了.
    2009年11月4日 3:12
  • 同意.
    public class Drivers
    {
     
     public DriverCollection driver;
     public string test;
     public string a;

     public Drivers()
     {
      driver = new DriverCollection();
      driver.Add(new Driver());
      driver.Add(new Driver());
      test = "";
      a = "OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!";
     }
     
    }
    public class DriverCollection : Collection<Driver>
    {

    }
    public class Driver
    {
     private string name;

     public string Name
     {
      get { return name; }
      set { name = value; }
     }
     private int space;

     public int Space
     {
      get { return space; }
      set { space = value; }
     }

     public Driver()
     {
      name = "XXXX";
      space = 0;
     }

    序列化后结果如下:
    <Drivers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">

    <driver>
    <Driver>
      <Name>XXXX</Name>
      <Space>0</Space>
      </Driver>
    <Driver>
     <Name>XXXX</Name>
      <Space>0</Space>
      </Driver>
      </driver>
      <test />
      <a>OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!</a>
      </Drivers>

    Gao Peter
    • 已建议为答案 Petergao 2009年11月4日 4:59
    • 已标记为答案 male110 2009年11月4日 9:46
    2009年11月4日 4:10