C#使用XmlSerializer解析XML时如何将DataObject节点内容转为字符串
解决方案
你可以通过 XmlAnyElementAttribute 捕获 DataObject 节点的完整内容,再读取节点的 InnerXml 属性实现需求,无需修改反序列化逻辑,仅调整 BaseResponse 类的特性标记即可:
第一步:修改BaseResponse类定义
using System.Xml; using System.Xml.Serialization; public class BaseResponse { // 兼容第二个示例中的<Status>节点,如果确定只有<StatusCode>可以去掉多余的ElementName配置 [XmlElement(ElementName = "StatusCode")] [XmlElement(ElementName = "Status")] public int StatusCode { get; set; } public string Text { get; set; } // 捕获名称为DataObject的完整XML节点,不解析内部结构 [XmlAnyElement("DataObject")] public XmlElement DataObjectRaw { get; set; } // 对外暴露的字符串属性,不参与序列化反序列化 [XmlIgnore] public string DataObject { get { if (DataObjectRaw == null) return string.Empty; // 如需保留原始缩进换行可去掉Trim() return DataObjectRaw.InnerXml.Trim(); } set { // 若需要序列化回XML可在此实现set逻辑,仅反序列化场景可忽略 } } public static BaseResponse Get(string xmlResponse) { XmlSerializer serializer = new XmlSerializer(typeof(BaseResponse)); using (StringReader reader = new StringReader(xmlResponse)) { return (BaseResponse)serializer.Deserialize(reader); } } }
实现说明
[XmlAnyElement("DataObject")]会让XmlSerializer将匹配名称的节点完整映射为XmlElement对象,不会递归解析内部子节点,不管节点内容是纯文本还是嵌套XML都能完整保留- 调用
XmlElement.InnerXml即可直接拿到节点内的全部内容:- 纯文本场景下返回原始文本字符串
- 嵌套子节点场景下返回所有子节点的完整XML字符串,完全符合要求的输出格式
- 类中对
StatusCode添加了两个XmlElement标记,可以同时兼容两个示例中出现的<StatusCode>和<Status>两种节点名称,不需要兼容可删除多余配置
效果验证
- 纯文本
DataObject场景:返回值为1111-1111-2222-121212-12121 - 嵌套子节点场景:返回值为
<DetailStatus><Author>Peter</Author><DateCreated>21.08.2021 19:00:05</DateCreated></DetailStatus>
内容的提问来源于stack exchange,提问作者G43beli
相关产品推荐
相关产品推荐

