XML-将属性反序列化为XML子树
本文关键字:XML 子树 反序列化 属性 XML- | 更新日期: 2023-09-27 18:22:11
当我反序列化xml字符串时,我需要在名为prop2
的字符串属性上保存XElement outerXml。
我的XML:
<MyObj>
<prop1>something</prop1>
<prop2>
<RSAKeyValue>
<Modulus>...</Modulus>
<Exponent>...</Exponent>
</RSAKeyValue>
</prop2>
<prop3></prop3>
</MyObj>
我的对象:
public class MyObj
{
[XmlElement("prop1")]
public string prop1 { get; set; }
[XmlText]
public string prop2 { get; set; }
[XmlElement(ElementName = "prop3", IsNullable = true)]
public string prop3 { get; set; }
}
我正在使用XmlSerializer
进行反序列化,如下所示:
var serializer = new XmlSerializer(typeof(T));
return (T)serializer.Deserialize(new StringReader(myXmlString));
我尝试使用[XmlText]
在prop2
中保存XML文本,但我只得到了null
。
我需要做些什么才能在prop2
中保存类似<RSAKeyValue><Modulus>...</Modulus><Exponent>...</Exponent></RSAKeyValue>
的文本?
XmlText
将以XML编码的文本形式给出值(">prop2<..."
),请参见XmlTextAttribute
默认情况下,XmlSerializer将类成员序列化为XML元素。但是,如果将XmlTextAttribute应用于成员,则XmlSerializer会将其值转换为XML文本。这意味着该值被编码到XML元素的内容中。
一种可能的解决方案-使用XmlNode
作为属性类型:
public class MyObj
{
[XmlElement("prop1")]
public string prop1 { get; set; }
public XmlNode prop2 { get; set; }
[XmlElement(ElementName = "prop3", IsNullable = true)]
public string prop3 { get; set; }
}
var r = (MyObj)serializer.Deserialize(new StringReader(myXmlString));
Console.WriteLine(r.prop2.OuterXml);
或者,您可以使整个对象实现自定义Xml序列化,或者具有与Xml匹配的自定义类型(正常读取),并具有将该对象表示为Xml字符串的附加属性。