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

AngleSharp使用XmlParser解析含XHTML实体的XML报错如何解决?

问题根因

你的配置本身没有错误,报错和IsResourceLoadingEnabled、WithCss()这些配置项无关。
标准XML规范仅内置5个基础实体:<、>、&、"、'。你用到的ß是XHTML DTD中定义的扩展命名实体,AngleSharp.Xml默认遵循严格XML规范,不会内置XHTML实体映射,也不会自动解析外部DTD中的实体定义,遇到未声明的实体会直接抛出解析异常。

解决方案

优先选择无外部依赖的实体注册方案,不需要修改原XML内容,稳定性和性能都更好。

方案1:内置实体映射(推荐)

AngleSharp的HTML解析模块已经内置了所有HTML/XHTML标准实体的映射,直接引入到XML解析配置中即可支持全部XHTML实体,无需加载外部DTD。

  1. 确保项目安装了AngleSharp.Xml和AngleSharp.Html两个NuGet包(如果已经安装AngleSharp全量包则无需额外安装)
  2. 使用如下配置初始化解析器:
using AngleSharp;
using AngleSharp.Html.Parser;
using AngleSharp.Xml;
using AngleSharp.Xml.Parser;

var config = Configuration.Default
    .WithXml()
    // 注册HTML标准实体表,覆盖所有XHTML命名实体
    .With<AngleSharp.Dom.IEntityProvider>(new HtmlEntityProvider())
    // 不需要CSS、外部资源加载可以移除对应配置,不影响实体解析
    .WithCss();

var context = BrowsingContext.New(config);
var xml = @"<xml><p>Ma&szlig;nahmen</p></xml>";
var xmlParser = new XmlParser(new XmlParserOptions(), context);
var xmlDoc = xmlParser.ParseDocument(xml);

// 验证输出:p节点文本为Maßnahmen
Console.WriteLine(xmlDoc.QuerySelector("p").TextContent);

如果不想引入HTML相关依赖,也可以自定义实体提供者,只注册你需要用到的实体:

public class CustomEntityProvider : AngleSharp.Dom.IEntityProvider
{
    private readonly Dictionary<string, string> _entityMap = new()
    {
        { "szlig", "ß" },
        // 按需追加其他实体,比如&nbsp; 对应 "\u00A0"、&copy;对应"©"
    };

    public string GetEntity(string name) => _entityMap.TryGetValue(name, out var val) ? val : null;
}

// 配置时替换为自定义provider即可
// .With<AngleSharp.Dom.IEntityProvider>(new CustomEntityProvider())

方案2:DTD引用解析(不推荐生产环境使用)

如果一定要走DTD声明的方式,需要做两个修改:

  1. 在XML内容头部加上XHTML DOCTYPE声明
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<xml><p>Ma&szlig;nahmen</p></xml>
  1. 配置中开启DTD解析和外部资源加载:
var config = Configuration.Default
    .WithXml()
    .WithDtd() // 开启DTD解析能力
    .WithDefaultLoader(new LoaderOptions { IsResourceLoadingEnabled = true });

注意:这种方式会主动拉取W3C服务器上的DTD文件,解析速度慢,还可能因为网络故障、W3C访问限流导致解析失败,仅适合本地测试场景使用。

关于DTD的说明

AngleSharp.Xml默认不会自动解析外部DTD引用,必须显式调用WithDtd()开启DTD解析能力、同时开启资源加载才会拉取外部DTD内容,不会自动执行实体解析逻辑。


内容的提问来源于stack exchange,提问作者Heinrich Ulbricht

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:27:14