我使用标准的.Net XmlSerializer来解决CDATA反序列化问题.
更新:我从外部系统获取XML,我不能影响它的格式,所以我不能将CData包含在一个单独的属性元素中.
序列化给出了:
反序列化不会将对象恢复为原始状态.
这是正在序列化的类:
public class MyClass { string _data; [XmlIgnore] public string Data { get { return _data; } set { _data = value; } } [XmlAnyElement] public XmlCDataSection CData { get { return new XmlDataDocument().CreateCDataSection(Data); } set { Data = value.Value; } } }
这是失败的测试:
[Test] public void CData_as_inner_text_test() { MyClass item = new MyClass(); item.Data = "Hello, world!"; XmlSerializer serializer = new XmlSerializer(item.GetType()); string serialized; using (StringWriter sw = new StringWriter()) { serializer.Serialize(sw, item); serialized = sw.GetStringBuilder().ToString(); } MyClass deserialized; using (StringReader sr = new StringReader(serialized)) { deserialized = (MyClass)serializer.Deserialize(sr); } Assert.AreEqual(item.Data, deserialized.Data); // For some reason, deserialized.Data == null }
我在这里发现了同样的问题,但没有答案: XmlSerializer,XmlAnyElement和CDATA
CData属性结束为null,因为CDATA部分的内容最终在Data属性中被忽略...
绝对等同于:
Hello, world!
您不应该关心外部应用程序是否将MyClass的内容写为CData.同样,外部应用程序不应该关心你如何写出来.
IOW,这应该是你所需要的:
public class MyClass { string _data; [XmlText] public string Data { get { return _data; } set { _data = value; } } }