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>的文本?

XML-将属性反序列化为XML子树

XmlText将以XML编码的文本形式给出值("&gt;prop2&lt;..."),请参见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字符串的附加属性。