【问题标题】:Using C# to convert incorrect html string to real html使用 C# 将不正确的 html 字符串转换为真正的 html
【发布时间】:2015-12-03 00:42:03
【问题描述】:

我最初的问题是我试图将包含 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>

但是,我有 2 个问题

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


2.字符串看起来例如如上所述,但不是完全正确的 html(没有&lt;p&gt; 标签,没有&lt;br&gt; 标签)。 现在我想用 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。在上面的示例中,它会在&lt;li&gt; 标签之间创建&lt;br /&gt;s,或者在&lt;p&gt; 标签中导致&lt;ul&gt; 标签——这都是不允许的。

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

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

您有任何建议如何使用字符串替换、正则表达式或更好的解决方案(HtmlDocument)来解决这个问题?

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

谢谢!

编辑:明确区分 2 个问题

EDIT2:对反序列化没有影响

EDIT3:添加目标输出

【问题讨论】:

  • html 编码怎么样?
  • 您的问题是“如何在 XML 中传输 HTML”,还是 “如何从无效的 HTML 中生成有效的 HTML”?还是“哪个更容易”?
  • 有效问题,实际上两者都有,但第二个优先级更高。我已经把上面的 2 个主题分开了

标签: c# html string replace


【解决方案1】:

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

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


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

【讨论】:

  • 这里提到了 HtmlAgilityPack,但是我找不到任何合适的文档。它是否提供了一种方法来纠正不允许的序列或嵌套(例如 p 中的 ul 或 ul 中的 br)?
【解决方案2】:

我不得不做类似的事情(确保第 3 方内容具有有效的 HTML)。如果我这样做,我会执行以下操作:

1) 用 HTML 换行符替换换行符

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

2) 使用 HTMLAgility 包修复任何无效的 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;
    }

【讨论】:

  • 这并不能完全解决我的问题:1. 这不考虑段落并在&lt;ul&gt;s 中添加&lt;br /&gt; 标签(这是无效的) 2. 这既不正确&lt;ul&gt; &lt;p&gt; 标签内的 s,也不会更正 &lt;ul&gt;s 内的 &lt;br /&gt; 标签。即使我使用doc.OptionFixNestedTags = true;,这种行为也是一样的
  • 你能提供输入和输出的样本吗?它应该删除替换添加的无效
    ...
  • 对于输入,见上文,还要注意没有用&lt;br&gt;s 或&lt;p&gt;s 标记的换行符。因此,目标工具中不考虑换行符。我将更新我的帖子以显示目标输出
猜你喜欢
  • 2020-05-15
  • 1970-01-01
  • 2012-09-03
  • 1970-01-01
  • 1970-01-01
  • 2013-08-21
  • 2016-02-02
  • 1970-01-01
  • 2019-01-03
相关资源
最近更新 更多