如何在.NET中将HTML文本转换为JIRA兼容的格式化文本?
.NET 端HTML转JIRA Wiki格式实现方案
别用字符串查找替换硬做,碰到嵌套列表、多层标签嵌套的场景根本兜不住,基于HTML DOM解析做结构化转换才是稳定方案,具体落地方式如下:
- 依赖选择
直接通过NuGet安装AngleSharp库即可,无额外依赖,兼容所有.NET版本(.NET Framework、.NET Core/.NET 5+都支持),对前端编辑器输出的不规范富文本HTML容错性很好,适合这类转换场景。 - 核心实现逻辑
按照深度优先的顺序遍历解析后的DOM节点,按节点类型映射对应JIRA Wiki标记,重点处理列表的层级缩进逻辑:- 行内标签映射(直接替换对应包裹标记即可):
<strong>、<b>标签包裹的内容,外层套*,对应JIRA加粗格式<em>、<i>标签包裹的内容,外层套_,对应斜体格式- 行内
<code>标签内容外层套{{和}},对应行内代码格式 <del>、<s>标签内容外层套-,对应删除线格式<a>标签转成[链接文本|链接地址]格式<pre>包裹的代码块,外层用{code:代码语言}和{code}包裹,对应JIRA代码块
- 块级标签映射:
<h1>到<h6>标签,分别在内容开头加h1.到h6.前缀,对应JIRA标题层级<p>标签保留内部转换后的内容,段落之间空一行分隔<br/>标签直接转成单个换行
- 列表标签特殊处理(简单替换失效的核心场景):
遍历<ul>、<ol>节点时额外记录当前列表的嵌套深度,每嵌套一层就增加2个空格的缩进:- 无序列表
<ul>下的直接<li>子节点,按当前缩进量在开头加*,比如一级列表项是* 列表内容,二级嵌套的无序列表项开头加2个空格再写* - 有序列表
<ol>下的直接<li>子节点,按缩进量在开头加#,嵌套缩进规则和无序列表一致 - 如果
<li>内部还嵌套了子列表,递归处理子列表节点时自动把层级计数+1,就能自动生成正确缩进的列表标记,完全不需要写复杂正则匹配开闭标签,不会出现列表层级错乱的问题
- 无序列表
- 行内标签映射(直接替换对应包裹标记即可):
- 落地优化
所有节点遍历完成后,统一做一次后处理:把连续3个以上的空行压缩成1个空行,去掉每行首尾的多余空白,避免生成的内容在JIRA里渲染出多余空行。如果你的编辑器有自定义特殊标签,只需要在节点遍历的分支判断里加对应映射规则就行,扩展成本很低。 - 避坑提示
不要尝试用正则表达式做全量HTML转换,HTML本身是结构化树形结构,正则没法正确处理任意层级的标签嵌套,尤其是多层嵌套列表、块级标签套行内标签的场景,很容易出现标记错位、格式错乱的问题,基于DOM遍历的方案稳定性要高几个量级。
内容的提问来源于stack exchange,提问作者Cyberhex
相关产品推荐
相关产品推荐

