C# 解析 Markdown

C# 解析 Markdown

编码文章call10242025-03-28 11:16:1625A+A-

Markdig 是一个功能强大且可扩展的 Markdown 解析器库,它支持将 Markdown 文本解析为抽象语法树(AST)。通过访问 AST,你可以对 Markdown 文档进行深入分析和操作。以下是实现从 Markdown 文本中获取 AST 并遍历它的完整示例。

1. 安装 Markdig 库

在使用 Markdig 之前,你需要确保已安装该库。可以通过 NuGet 包管理器安装:

dotnet add package Markdig

2. 示例代码:解析 Markdown 并获取 AST

以下代码展示了如何使用 Markdig 将 Markdown 文本解析为 AST,并递归遍历 AST 的每个节点。

using System;
using Markdig;
using Markdig.Syntax;

class Program
{
    static void Main(string[] args)
    {
        // 示例 Markdown 文本
        string markdown = @"
# 标题
这是一个段落。

- 列表项 1
- 列表项 2

> 引用内容
";

        // 使用 Markdig 解析 Markdown 文本为 AST
        var pipeline = new MarkdownPipelineBuilder().Build();
        var document = Markdown.Parse(markdown, pipeline);

        // 遍历 AST
        Console.WriteLine("开始遍历 AST:");
        TraverseAst(document);
    }

    /// 
    /// 递归遍历 AST 节点
    /// 
    /// 当前节点
    static void TraverseAst(MarkdownObject node)
    {
        // 打印当前节点的类型和内容
        Console.WriteLine($"节点类型: {node.GetType().Name}, 内容: {node}");

        // 如果节点有子节点,递归遍历
        if (node is ContainerBlock container)
        {
            foreach (var child in container)
            {
                TraverseAst(child);
            }
        }
    }
}

3. 代码解析

3.1 解析 Markdown 文本为 AST

  • Markdown.Parse 方法将 Markdown 文本解析为一个 MarkdownDocument 对象,这是 AST 的根节点。
  • MarkdownPipelineBuilder 用于构建解析管道,支持自定义扩展(如表格、任务列表等)。

3.2 遍历 AST

  • MarkdownObject 是所有 AST 节点的基类。
  • 每个节点可能是一个容器节点(ContainerBlock),包含子节点,也可能是一个叶子节点(如文本块)。
  • 通过递归调用 TraverseAst 方法,可以遍历整个 AST。

4. 输出示例

假设输入的 Markdown 文本如下:

# 标题
这是一个段落。

- 列表项 1
- 列表项 2

> 引用内容

运行程序后,输出的 AST 结构可能如下:

开始遍历 AST:
节点类型: MarkdownDocument, 内容: # 标题
这是一个段落。

- 列表项 1
- 列表项 2

> 引用内容

节点类型: HeadingBlock, 内容: # 标题
节点类型: ParagraphBlock, 内容: 这是一个段落。
节点类型: ListBlock, 内容: 
- 列表项 1
- 列表项 2

节点类型: ListItemBlock, 内容: 列表项 1
节点类型: ParagraphBlock, 内容: 列表项 1
节点类型: ListItemBlock, 内容: 列表项 2
节点类型: ParagraphBlock, 内容: 列表项 2
节点类型: QuoteBlock, 内容: > 引用内容
节点类型: ParagraphBlock, 内容: 引用内容

5. 注意事项

  1. 节点类型:Markdig 提供了多种节点类型(如 HeadingBlock、ParagraphBlock、ListBlock 等),可以根据需要对特定类型的节点进行处理。
  2. 扩展性:如果需要支持额外的 Markdown 功能(如表格、脚注等),可以在 MarkdownPipelineBuilder 中添加相应的扩展。
  3. 性能优化:对于大型 Markdown 文档,递归遍历可能会带来性能开销,建议根据实际需求优化遍历逻辑。

通过上述代码,你可以轻松解析 Markdown 文本并遍历其 AST,从而实现对文档结构的深度分析和操作。

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4