我最初的问题是我试图将包含 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>
但是,我有两个问题
- 将 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 section或 base64-encoding输入也足够了。不要使用“实体编码”,因为您的 XML 解析器会提示不是 XML 实体的 HTML 实体。
关于c# - 使用 C# 将不正确的 html 字符串转换为真正的 html,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32439003/