使用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>
但是,我有两个问题
- 将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:添加目标输出
你要做的是实现一个"标签汤解析器",它接受可能是也可能不是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;
}