当前位置:编程学习 > C#/ASP.NET >>

xml反序列化

有xml格式如下

<reqdata>
<user>admin</user>
<message>
<xml>
                          <a>sd</a>
                          <b>sd</b>
</xml>
</message>
</reqdata>

c#类代码如下,我在把xml反序列化成字典的时候,像把message节点里的<xml><a>sd</a><b>sd</b></xml>这段当成message的值,请问代码该怎么改

    [XmlRoot("xml")]
    public class SerializableDictionary<TKey, TValue>
        : Dictionary<TKey, TValue>, IXmlSerializable
    {

        public new TValue this[TKey key]
        {
            get
            {
                if (!this.ContainsKey(key))//这样判断之后,如果不存在该键,直接访问也不会报错,否则会报KeyNotFound异常。
                {
                    return default(TValue);
                }
                return base[key];
            }
            set
            {
                base[key] = value;
            }
        }

        #region 构造函数
        public SerializableDictionary()
            : base()
        {
        }

        public SerializableDictionary(IDictionary<TKey, TValue> dictionary)
            : base(dictionary)
        {
        }


        public SerializableDictionary(IEqualityComparer<TKey> comparer)
            : base(comparer)
        {
        }


        public SerializableDictionary(int capacity)
            : base(capacity)
        {
        }

        public SerializableDictionary(int capacity, IEqualityComparer<TKey> comparer)
            : base(capacity, comparer)
        {
        }

        protected SerializableDictionary(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
        }
        #endregion

        #region IXmlSerializable 接口的实现
        public XmlSchema GetSchema()
        {
            throw new NotImplementedException();
            //return null -- by lls.
        }

        /// <summary>
        /// 从对象的XML表示形式生成该对象 
        /// </summary>
        /// <param name="reader"></param>
        public void ReadXml(XmlReader reader)
        {
            XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));

            //对于反序列化,reqdata节点下只有一层,所以这样处理就足够了.(如果reqdata节点下有多个层级则需要进一步处理) ????
            string key = null;
            while (reader.Read())
            {
                //<username />这种标记.值为 string.Empty.
                if (reader.NodeType == XmlNodeType.Element)
                {
                    key = reader.Name;
                    this.Add((TKey)(key as object), (TValue)(string.Empty as object));
                }
                if (reader.NodeType == XmlNodeType.Text)
                {
                    this[(TKey)(key as object)] = (TValue)(reader.Value as object);
                }
                if (reader.NodeType == XmlNodeType.CDATA)
                {
                    this[(TKey)(key as object)] = (TValue)(reader.Value as object);
                }
            }
        }


        /// <summary>
        /// 将对象转换为其XML表示形式
        /// </summary>
        /// <param name="writer"></param>
        public void WriteXml(XmlWriter writer)
        {
            XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
            XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
            foreach (TKey key in this.Keys)
            {
                writer.WriteStartElement(key.ToString());
                if (this[key] is IDictionary)
                {

                    this.Write(writer, this[key] as IDictionary);

                }
                else if (this[key] is IEnumerable<IDictionary>)
                {
                    this.Write(writer, this[key] as IEnumerable<IDictionary>);
                }
                else
                {
                    //如果按严格的标准,若this[key]==null则不需要执行下两这一句,即不需要写任何Xml元素.为了不缺少元素,这里系列化为空元素,例如:
                    //this["p"]=null序列化为<p></p>
                    //writer.WriteElementString(key.ToString(), this[key] == null ? string.Empty : this[key].ToString());
                    writer.WriteValue((this[key] == null || this[key].Equals(DBNull.Value)) ? string.Empty : this[key].ToString());
                    //writer.WriteCData((this[key] == null || this[key].Equals(DBNull.Value)) ? string.Empty : this[key].ToString());
                }
                writer.WriteFullEndElement();
            }
        }

        private void Write(XmlWriter writer, IEnumerable<IDictionary> collection)
        {
            if (collection == null)
            {
                return;
            }
            foreach (var item in collection)
            {
                if (item is IDictionary)
                {
                    Write(writer, item as IDictionary);
                }
            }
        }

        private void Write(XmlWriter writer, IDictionary dic)
        {
            if (dic == null)
            {
                return;
            }
            foreach (var key in dic.Keys)
            {
                writer.WriteStartElement(key.ToString());
                var value = string.Empty;
                if (dic[key] is IDictionary)
                {
                    Write(writer, dic[key] as IDictionary);
                }
                else if (dic[key] is IEnumerable<IDictionary>)
                {

                    this.Write(writer, dic[key] as IEnumerable<IDictionary>);
                }
                else
                {
                    writer.WriteValue((dic[key] == null || dic[key] == DBNull.Value) ? string.Empty : dic[key]);
                }
                //writer.WriteEndElement();
                writer.WriteFullEndElement();
            }
        }
        #endregion
    }
--------------------编程问答-------------------- 有人吗 --------------------编程问答-------------------- 如果我做的话,我会这样做:
    1.定义一个字符串变量。
    2.把message的子节点取出来赋给变量,然后在循环子节点,循环一次就在变量的基础上增加一次。
    3.最后message的值就取变量的值。
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,