You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# XML反序列化时如何替换字段值内部未转义的左尖括号<?

问题解决方案

你遇到的核心问题是待解析的XML不属于良构XML:标准XML规范要求元素文本内容中的<必须转义为&lt;,否则解析器会将其识别为新标签的起始符,直接抛出解析异常。以下是两种可直接落地的解决方法:

方法1:正则预处理指定标签内部内容

如果你明确知道哪些标签内部可能夹带未转义的特殊字符(本例是Description标签),可以先用正则匹配出对应标签的内部内容,将其中的<统一替换为&lt;,再走标准反序列化流程,改造成本极低。
修改后的可运行代码如下:

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("<", "&lt;");
        });
        
        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库先解析节点内容,再手动映射到自定义类,适配性更强。
操作步骤:

  1. 先通过Nuget安装AngleSharp包
  2. 改写解析逻辑如下:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 10:39:00