怎样实现下面的Xml类结构
<page name="Test">
    <header height="95">
        <item text="C1" />
        <item text="C2" />
    </header>
</Page>我对item写了一个序列化的类Item
再写了一个Header类继承CollectionBase,打了个标签[XmlType("header")]
再写了一个page类
但现在问题出来了,我的header的height属性出不来,同时序列化的XML为Header,不是标签的"header"形式

解决方案 »

  1.   

     [XmlAttribute("height")]
            public string height
            {
                get
                {
                    return _height;
                }
                set
                {
                    _height=value;
                }
            }
      

  2.   

    我就是用的是XmlAttribute,但序列化成XML,height属性看不见了,不晓得是不是因为继承CollectionBase的原因
      

  3.   

    以下是我写的对象:    [Serializable]  
        [XmlType("header")]
        public class HeaderData : CollectionBase
        {
            private string m_height = "90";
            /// <summary>
            /// Header的高度
            /// </summary>
            [XmlAttribute(AttributeName = "height")]
            public string Height
            {
                get { return m_height; }
                set { m_height = value; }
            }
              
            //下面的把Item集合进来了
             ...
      

  4.   

    以下是我写的对象:    [Serializable]  
        [XmlType("header")]
        public class HeaderData : CollectionBase
        {
            private string m_height = "90";
            /// <summary>
            /// Header的高度
            /// </summary>
            [XmlAttribute(AttributeName = "height")]
            public string Height
            {
                get { return m_height; }
                set { m_height = value; }
            }
              
            //下面的把Item集合进来了
             ...
      

  5.   

     [XmlType("header")] 
    这个东东干啥用的貌似不要吧
      

  6.   

    其实就是一个:
    <page name="Test"> 
        <header height="95"> 
            <item text="C1" /> 
            <item text="C2" /> 
        </header> 
    </Page> 能实现height属性和包含item的集合类HeaderClass的序列化问题
      

  7.   


    那你的header应该是page的Element才对喔,你到底要不要把page一起序列化啊。
      

  8.   

    恩,Header是Page的XmlElement,我是这样写的,Xmltype是不需要的,问题还是没解决
      

  9.   


    还有那个序列化 [Serializable] 貌似不该写在Header类里头,应该写在Page里啊!!!还有要[XmlRoot("page")]
      

  10.   

    如果Header作为Page的XmlElement,序列化是这样的结果:
    <page name="Test"> 
        <header text="C1" /> 
        <header text="C2" > 
    </Page>
    而不是以下形式
    <page name="Test"> 
        <header height="95"> 
            <item text="C1" /> 
            <item text="C2" /> 
        </header> 
    </Page>
    [Serializable]加不加再类头上都是一样的
    写成[XmlRoot("page")] 也是一样的。
      

  11.   

    你header类里有类似下面的代码吗?[XmlElement("item")]
     public Item[] DataItems//Item是你写得新的一个类
    {
         get { return this.items; }
         set
         {
             this.items = value;
         }
    }header不需要继承CollectionBase 
      

  12.   

    貌似看你的那个结果就是CollectionBase 出的问题。
      

  13.   

    要继承CollectionBase 也应该是Item来继承啊,不过根本不需要。
      

  14.   

    现在,我的Header类是这样写的,他不继承CollectionBase 
            private List<ItemData> m_ItemCollection;
            [XmlArrayItem("item")]
            [XmlArray("ItemCollection")]
            public List<ItemData> ItemCollection
            {
                get
                {
                    if (m_ItemCollection == null)
                    {
                        m_ItemCollection = new List<ItemData>();
                    }
                    return m_ItemCollection;
                }
                set
                {
                    m_ItemCollection = value;
                }
            }
    但现在序列化出来的形式为
    <Page>
      <header height="90">
        <ItemCollection>
          <item text="C1" />
          <item text="C2" />
     ...
    中间多了一个<ItemCollection>
    不晓得有办法去掉没?
      

  15.   

     [XmlArrayItem("item")] 
     [XmlArray("ItemCollection")] 
    换成
    [XmlElement("item")] 
      

  16.   

    谢谢 pcjbird ,用数组确实可以省掉<ItemCollection> 
    [XmlElement("item")]
            public ItemData[] DataItems//Item是你写得新的一个类 
            {
                get { return this.items; }
                set
                {
                    this.items = value;
                }
            }
    但ItemData[]实例化时本身要指定大小,你怎么解决大数据问题?
      

  17.   

    参考
    http://www.cnblogs.com/surfsky/archive/2007/03/13/673620.html
      

  18.   

    恩,问题解决了,谢谢热情的pcjbird,结贴了。
    很奇怪,我之前的Header继承CollectionBase出来奇奇怪怪的东西,真不晓得是为什么?
    也谢谢 wuyq11,你发的我看了,散分了。
      

  19.   


    不需要指定数组大小。
    private ItemData[] items;
    这样就OK了。
    当然你在set里也可以写成这样: set
                {
                    if (value == null)
                        throw new ArgumentException("data items cannot be null!");
                    this.items = value;
                }
      

  20.   

    你用List也行,最后用ToArray就OK了。