C# 10中使用StringWriter、StringReader与XmlSerializer序列化/反序列化XML的属性及元素文本值
解决XML元素文本内容的序列化/反序列化问题
嘿,这个问题我太熟悉了!你已经搞定了XML属性的映射,但元素内部的文本值需要借助[XmlText]特性来处理,我给你调整一下你的OtherInfo类:
[Serializable] public class OtherInfo { [XmlAttribute(AttributeName = "name")] public string Name { get; set; } [XmlAttribute(AttributeName = "type")] public string Type { get; set; } // 用[XmlText]标记这个属性,对应XML元素的内部文本内容 [XmlText] public string TextContent { get; set; } public OtherInfo() { } public OtherInfo(string name, string type) => (Name, Type) = (name, type); // 可以加个重载构造函数,方便一次性初始化所有内容 public OtherInfo(string name, string type, string textContent) => (Name, Type, TextContent) = (name, type, textContent); }
关键说明:
[XmlText]特性是专门用来告诉XmlSerializer,这个属性对应XML元素的内部文本节点,完美匹配你需求里的Hello World!!!部分。- 这个属性的名字可以随便取(比如我这里用了
TextContent),只要加上[XmlText]标记就行。
测试示例
序列化(对象转XML)
var info = new OtherInfo("Some Name", "text", "Hello World!!!"); var serializer = new XmlSerializer(typeof(OtherInfo)); using (var writer = new StringWriter()) { serializer.Serialize(writer, info); Console.WriteLine(writer.ToString()); }
运行后会输出你需要的XML:
<OtherInfo name="Some Name" type="text">Hello World!!!</OtherInfo>
反序列化(XML转对象)
var xmlContent = @"<OtherInfo name=""Some Name"" type=""text"">Hello World!!! </OtherInfo>"; var serializer = new XmlSerializer(typeof(OtherInfo)); using (var reader = new StringReader(xmlContent)) { var info = (OtherInfo)serializer.Deserialize(reader); Console.WriteLine($"Name: {info.Name}, Type: {info.Type}, Text: {info.TextContent}"); }
运行后会输出:Name: Some Name, Type: text, Text: Hello World!!!(注意原XML里的换行也会被保留在TextContent里,如果不需要可以额外处理)
内容的提问来源于stack exchange,提问作者khteh
相关产品推荐
相关产品推荐

