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

本文关键字:html 转换 字符串 不正确 使用 | 更新日期: 2023-09-27 18:11:28

我原来的问题是,我试图序列化一个包含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 (xhtml ?)。


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

    string result = "<p>" + text
     .Replace(Environment.NewLine + Environment.NewLine, "</p><p>")
     .Replace(Environment.NewLine, "<br />")
     .Replace("</p><p>", "</p>" + Environment.NewLine + "<p>") + "</p>";
但是,这并不是在所有情况下都能生成有效的html。在上面的例子中,它会在<li>标签之间创建<br /> s,或者在<p>标签中创建<ul>标签——这两种情况都是不允许的。

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

<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>

你有什么建议如何用字符串解决这个问题吗?替换,Regex,或更好的解决方案(HtmlDocument)?

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

谢谢!

编辑:清楚地把两个问题分开

EDIT2: No influence on反序列化

EDIT3:添加目标输出

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

你要做的是实现一个"标签汤解析器",它接受可能是也可能不是HTML的文本作为输入,并将其转换为HTML解析器可以处理的有效DOM。

你不想重新发明这个轮子,最肯定不是简单的字符串替换。参见如何解析糟糕的html?给一些提示。


或者您可以对输入HTML进行编码,使其不会干扰您试图放入的XML,例如CDATA部分或base64编码,输入也就足够了。不要使用"实体编码",因为XML解析器会抱怨HTML实体不是XML实体。

我不得不做类似的事情(确保第三方内容具有有效的HTML)。如果我要这样做,我会这样做:

1)将换行符替换为HTML换行符

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

2)使用HTMLAgility pack来修复任何无效的HTML

    var doc = new HtmlDocument();
    HtmlNode.ElementsFlags["p"] = HtmlElementFlag.Closed;
    doc.OptionFixNestedTags = false;
    doc.LoadHtml(result);
    if (doc.ParseErrors.Count() > 0)
    {
                // throw error
    }else{
                // get fixed html
                 result= doc.DocumentNode.OuterHtml;
    }