C# XML反序列化时如何替换字段值内部未转义的左尖括号<?
问题解决方案
你遇到的核心问题是待解析的XML不属于良构XML:标准XML规范要求元素文本内容中的<必须转义为<,否则解析器会将其识别为新标签的起始符,直接抛出解析异常。以下是两种可直接落地的解决方法:
方法1:正则预处理指定标签内部内容
如果你明确知道哪些标签内部可能夹带未转义的特殊字符(本例是Description标签),可以先用正则匹配出对应标签的内部内容,将其中的<统一替换为<,再走标准反序列化流程,改造成本极低。
修改后的可运行代码如下:
using System; using System.IO; using System.Text.RegularExpressions; using System.Xml.Serialization; [Serializable] public class XmlObject { public string Name {get; set; } public string Description {get; set; } } class Program { static void Main(string[] args) { XmlObject newObject = getNewXMLObject(); // 测试输出,可验证Description内容正确 Console.WriteLine(newObject.Description); } public static XmlObject getNewXMLObject() { string xmlString = "<Document><Name>Intel ICU v5</Name><Description>Intel ICU S<span id=\"ms-rterangecursor-end\">ite</Description></Document>"; // 预处理:替换Description标签内部的<为转义符 xmlString = Regex.Replace(xmlString, @"(?<=<Description>)(.*?)(?=</Description>)", match => { return match.Value.Replace("<", "<"); }); XmlRootAttribute xRoot = new XmlRootAttribute(); xRoot.ElementName = "Document"; var xmlSerializer = new XmlSerializer(typeof(XmlObject), xRoot); using(TextReader reader = new StringReader(xmlString)) { return (XmlObject) xmlSerializer.Deserialize(reader); } } }
方法2:使用容错解析库AngleSharp适配任意非良构场景
如果不确定有多少标签存在未转义问题,或者标签名不固定,可以用对非良构标记容忍度极高的AngleSharp库先解析节点内容,再手动映射到自定义类,适配性更强。
操作步骤:
- 先通过Nuget安装
AngleSharp包 - 改写解析逻辑如下:
using AngleSharp; using AngleSharp.Dom; public static XmlObject getNewXMLObject() { string xmlString = "<Document><Name>Intel ICU v5</Name><Description>Intel ICU S<span id=\"ms-rterangecursor-end\">ite</Description></Document>"; var context = BrowsingContext.New(Configuration.Default); var document = context.OpenAsync(req => req.Content(xmlString)).Result; // 直接读取节点内容,AngleSharp会自动处理非良构标记 return new XmlObject { Name = document.QuerySelector("Name")?.TextContent, Description = document.QuerySelector("Description")?.TextContent }; }
根源优化建议
如果可以对接XML的生成方,优先要求对方在输出字段内容时转义XML特殊字符(<、>、&、"、'),从生成侧避免非良构XML的出现。
内容的提问来源于stack exchange,提问作者curiousCoder
相关产品推荐
相关产品推荐

