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