.NET XmlSerializer类可以将InnerXml反序列化为字符串吗?

时间:2009-07-22 15:07:31

标签: .net xml serialization

我有一个非常具体的反序列化需求,请参见下面的示例:

说我有以下课程:

[Serializable]
public class Person {
public string Name { get; set; }
public string PersonXml { get; set; }
}

并遵循XML

<Person>
  <Name>John</Name>
  <PersonXml><someXmlFragment>text</someXmlFragment></PersonXml>
</Person>

我想要的是XmlSerializer类来反序列化&lt; PersonXml&gt;的InnerXml。 PersonXml属性的元素作为字符串。 我想知道是否可以做到。

注意: 我知道我可以编码&lt; PersonXml&gt;的内容逃避非法的XML字符,但我更希望让内部XML更加人性化(不包含&amp; lt;以及其他只会影响我最终用户的实体)

5 个答案:

答案 0 :(得分:3)

您可以随时实施IXmlSerializable,并通过XmlReader做任何您喜欢的事情。

答案 1 :(得分:1)

因此,即使元素实际上包含XML元素,您还希望.NET假装它真的是一个字符串吗?我认为这不可能通过标准序列化。

但是,您可以加载XML,转换PersonXml并正确转义它,然后用新转换的数据替换PersonXml的内容。它将涉及在反序列化之前手动操作XML,但是然后您可以将XML元素保留在PersonXml下。

答案 2 :(得分:1)

我在寻找类似的解决方案时难以理解这个答案。不想使用IXmlSerializable。

因此,如果有人在将来查看此问题,可以使用XmlAnyElement属性将内部xml序列化为XmlNode。然后,您可以根据需要对XmlNode进行处理,单独运行序列化或根据需要获取xml的文本。

对于这个例子:

public class Person 
{

  public string Name { get; set; }

  [XmlAnyElement]
  public XmlNode PersonXml { get; set; }

}

答案 3 :(得分:0)

为什么不使用XML来表示XML?只需将XmlElement用于PersonXml

假装XML与String相同,这总是一个坏主意。

答案 4 :(得分:0)

这篇文章很老了,但是我正在寻找解决方案,也许我的回答可以帮助别人。

怎么样?
[XmlText]
public string PersonXml { get; set; }

这不会解决您的问题,但可能是一种可接受的选择。

在我的情况下,PersonXml是一个“很好的元素”,并不总是包含Xml。当PersonXml包含Xml时,[XmlText]会导致PersonXml为null。但是,当PersonXml包含没有Xml的文本时,反序列化是正确的。

在没有[XmlText]的情况下,PersonXml中的Xml导致PersonXml之前的元素被正确反序列化,但PersonXml之后的元素被错误地反序列化。