c# - 使用 C# 将不正确的 html 字符串转换为真正的 html

标签 c# html string replace

我最初的问题是我试图将包含 html 标签的字符串序列化为 XML 元素。

hello <a href="world.php">World</a>, this

is
a nice
test

<ul>
  <li>to demonstrate my issue</li>
  <li>and find a solution</li>
</ul>

但是,我有两个问题

  1. 将 HTML 序列化为 XML:我没有成功定义 Serializable 类以使用 XmlSerialze 正确序列化,因此我决定使用 CDATA 部分可能是更好的方法。然而,目标工具没有正确反序列化(我对此没有影响)。我需要的是 xml 输出文件中的简单且正确的 html(XHMTL?)。


2. 字符串看起来像如上所述,但不是完全正确的 html(没有 <p> 标签,没有 <br> 标签)。 现在我想用 p 或 br 标签替换换行符。我看过here并使用了建议的解决方案:

    string result = "<p>" + text
     .Replace(Environment.NewLine + Environment.NewLine, "</p><p>")
     .Replace(Environment.NewLine, "<br />")
     .Replace("</p><p>", "</p>" + Environment.NewLine + "<p>") + "</p>";

但是,这并不是在所有情况下都生成有效的 html。在上面的示例中,它将创建 <br /><li> 之间标签或原因 <ul> <p> 内的标签标签 - 两者都是不允许的。

目标是得到如下结果(换行只是为了更好的可读性,在这里无关紧要)

<p>hello <a href="world.php">World</a>, this</p>
<p>is<br/>
a nice<br/>
test<br/></p>
<ul>
  <li>to demonstrate my issue</li>
  <li>and find a solution</li>
</ul>

对于如何使用 string.Replace、Regex 或更好的解决方案 (HtmlDocument) 来解决这个问题,您有什么建议吗?

请注意:我对反序列化没有影响,XML 输出由我对我没有影响的工具进行评估,并且必须是 UTF-8 编码。

谢谢!

编辑:明确区分这两个问题

EDIT2:对反序列化没有影响

EDIT3:添加目标输出

最佳答案

您要做的是实现 "tag soup parser" ,它将可能是也可能不是 HTML 的文本作为输入并将其转换为 HTML 解析器可以处理的有效 DOM。

您不想重新发明这个轮子,绝对不是简单的字符串替换。参见 How to parse bad html?一些提示。


或者您可以对输入的 HTML 进行编码,使其不会干扰您尝试放入的 XML,like a CDATA sectionbase64-encoding输入也足够了。不要使用“实体编码”,因为您的 XML 解析器会提示不是 XML 实体的 HTML 实体。

关于c# - 使用 C# 将不正确的 html 字符串转换为真正的 html,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32439003/

相关文章:

c - 程序崩溃?

c# - C# 如何递归列出目录中的所有文件?

c# - 热门应用程序如何更新和安装?

html - float 不正确清除导致元素隐藏在它们后面

php - 如何重写我的 PHP 和 MySQL 以按相等的列值对我的 HTML 列表进行分组?

java - 字符串只接受某些字符

c - 如何检查 C 中的两个字符串是否相同?

c# - FFMpegCore C# 从文件中读取字节

C# 标记 Charlie-Fox

html - 使用flexbox时如何使文本与li元素垂直居中?