尽管元素值包含混合内容,但将元素值反序列化为字符串

假设这样的XML:

 content   

content

还有一个类:

 [Serializable] [XmlType(AnonymousType = true, Namespace = "http://foo/bar")] [XmlRoot(ElementName = "Root", Namespace = "http://foo/bar", IsNullable = false)] public class MyRoot { public string FieldBasic { get; set; } public string FieldComplex { get; set; } } 

如何将反序列化为中的字符串? 它在内部找到HTML时失败。 我想让它给我一个包含这个内容的字符串:

  

content

如果我将FieldComplex声明为public object FieldComplex (即xsd:anyType ),它有点工作,我得到一个XMLNode[] ,我可以使用它。

但我需要FieldComplex为序列化的类型字符串,因为序列化XML不包含HTML,它将如下:

  content content  

FieldComplex声明为对象将在元素上插入这些属性:

  xmlns:q1="http://www.w3.org/2001/XMLSchema" p3:type="q1:string" xmlns:p3="http://www.w3.org/2001/XMLSchema-instance 

我不希望这样。 我也不想使用不同的类进行序列化和反序列化。

那么,有可能吗?

总而言之 ,是否有可能拥有这个课程:

 public class MyRoot { public string FieldBasic { get; set; } public string FielComplex { get; set; } } 

序列化为:

  content content  

并从此反序列化:

  content   

content

PS只是为了解释“为什么?”。 我有一个class级女巫被序列化。 然后,序列化的XML遍历应用程序中的多个节点,并最终返回,但如上所述进行了更改。 这些层执行一些XMLvalidation,并且在输入时具有额外的属性或元素会使validation失败并停止流程。 我想将返回XML映射到同一个类。 内容只是字符串从它的角度来看,但序列化/反序列化当然不一样:(

这还没有完成,因为我不记得你是否可以/如何将命名空间前缀添加到Xml序列化中的根元素。 但是如果你在MyRoot类中实现IXmlSerializable接口,如下所示:

 [XmlRoot("Root", Namespace="http://foo/bar")] public class MyRoot : IXmlSerializable 

然后自己编写XML序列化方法,如下所示:

  void IXmlSerializable.ReadXml(System.Xml.XmlReader reader) { reader.MoveToContent(); var outerXml = reader.ReadOuterXml(); XElement root = XElement.Parse(outerXml); this.FieldBasic = root.Elements(XName.Get("FieldBasic", "http://foo/bar")).First().Value; this.FieldComplex = root.Elements(XName.Get("FieldComplex", "http://foo/bar")).First().Elements().First().Value.Trim(); } void IXmlSerializable.WriteXml(System.Xml.XmlWriter writer) { writer.WriteRaw(String.Format("\r\n\t\r\n\t\t{0}\r\n\t", this.FieldBasic)); writer.WriteRaw(String.Format("\r\n\t\r\n\t\t{0}\r\n\t\r\n", this.FieldComplex)); } 

(从GetSchema方法返回null)

这应该让你至少非常接近你所追求的。

您可能还会发现这些链接很有帮助。

IXmlSerializable的

命名空间

您可以在XML中使用CDATA来指示内容是字符串文字:

  content   

content

]]>