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

时间:2015-11-16 17:20:11

标签: c# xml serialization xml-serialization xmlserializer

当我反序列化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

我需要做些什么来保存<RSAKeyValue><Modulus>...</Modulus><Exponent>...</Exponent></RSAKeyValue>中的prop2文字?

1 个答案:

答案 0 :(得分:3)

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字符串的附加属性。