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

7

我有一个非常具体的反序列化需求,如下所示:

假设我有以下类:

[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类将<PersonXml>元素的InnerXml反序列化为字符串类型的PersonXml属性。我想知道是否可以实现。

注意: 我知道我可以对<PersonXml>的内容进行编码,转义非法的XML字符,但我更喜欢保留内部XML的人性化(不包含&lt;和其他只会混淆最终用户的实体)。

5个回答

3

您总是可以实现 IXmlSerializable 并通过 XmlReader 实现自己想要的任何操作。


没错,我没有考虑过这条路。 这肯定会解决我的问题,虽然我还希望有更便宜的解决方案 :) - Piotr Owsiak
顺便提一下,你不需要在进行XML序列化时使用[Serializable]。在这种特定情况下,[XmlElement("Name")]也可以省略,因为它不会改变XMLSerializer的默认行为。 - Anton Tykhyy

1

所以,即使元素实际上包含XML元素,你希望.NET假装它是一个字符串?我不认为这可以通过标准序列化实现。

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


是的,但这对我来说似乎太麻烦了,而且解决方案也相当丑陋 :) - Piotr Owsiak

1
我在搜索类似解决方案时偶然发现了这个答案。不想使用IXmlSerializable。
因此,供参考,如果将来有人遇到此问题,可以使用XmlAnyElement属性将内部xml序列化为XmlNode。然后您可以根据需要对XmlNode进行后处理、单独运行序列化或仅获取xml文本。
对于这个例子:
public class Person 
{

  public string Name { get; set; }

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

}

还值得在PersonXml上添加[XmlText]属性。这将包括节点的所有文本节点。 - user2346593
这是一个很棒的技巧。解决了我无法序列化接口属性的问题。 <br/> [XmlIgnore] IMyInterface Thing {get;set;} <br/> [XmlAnyElement("Thing")] public XmlNode ThingSerializer { get; set; } // 在此处放置代码,将接口下的对象转换为/from XmlNode - flobadob

0

为什么不使用 XML 来表示 XML?只需使用 PersonXmlXmlElement

假装 XML 和 String 是同一件事情总是一个坏主意。


0

这篇文章可能有点旧,但我在寻找解决方案时发现了它,希望我的答案能对其他人有所帮助。

关于这个问题,你怎么看?

[XmlText]
public string PersonXml { get; set; }

这不会解决你的问题,但也许它可能是一个可以接受的替代方案。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接