从WebBrowser到有效XHTML的C#HTML

从WebBrowser到有效XHTML的C#HTML,c#,html,xhtml,browser,xmpp,C#,Html,Xhtml,Browser,Xmpp,因此,我们在编辑模式下使用webBrowser控件,允许用户输入文本,然后将文本发送到服务器,供所有人查看。这是一个HTML输入框 该框的HTML输出不是标准的XHTML,因为它只是一个webBrowser控件,所以我需要一个方法将任何不好的HTML转换为XHTML。我阅读了SGML,随后使用了: private static string Html2Xml(string txtHtmlString) { var xhtml = new Sgml.SgmlReader()

因此,我们在编辑模式下使用webBrowser控件,允许用户输入文本,然后将文本发送到服务器,供所有人查看。这是一个HTML输入框

该框的HTML输出不是标准的XHTML,因为它只是一个webBrowser控件,所以我需要一个方法将任何不好的HTML转换为XHTML。我阅读了SGML,随后使用了:

private static string Html2Xml(string txtHtmlString)
    {
        var xhtml = new Sgml.SgmlReader();
        var sw = new StringWriter();
        var w = new XmlTextWriter(sw);
        xhtml.DocType = "HTML";
        xhtml.InputStream = new StringReader(txtHtmlString);

        while ((!xhtml.EOF))
        {
            w.WriteNode(xhtml, true);
        }

        w.Close();
        return sw.ToString();
    }
我基本上是将HTML字符串传递给该方法,它返回“suposed”正确的XHTML。然而,它并没有通过XHTML检查,它返回的数据只是一个基本数据

<html><head></head><body></body></html> 

格式。因此,这不是正确的XHTML

那么,如何格式化它以实际输出正确的XHTML呢?MindShares网站上已经没有多少SGML文档了,所以不知道从这里开始该怎么做

本质上,我们需要WebBrowser控件中的HTML(它不是有效的XHTML)输出到XHTML,这样我们就可以将它附加到XMPP.msg.HTML元素(仅限有效的XHTML)。如果系统检测到HTML中的任何代码无效,它会将XMPP.msg.HTML标记为空白,因此我知道上述方法不起作用


谢谢

将使用TinyMCE或HtmlAgilityPack(可作为Nuget软件包或从codeplex获得)之类的东西重新命名

TinyMCE允许用户使用适当的格式控件执行富文本编辑,并将输出结果Html

另一方面,HtmlAgilityPAck是一个库,它允许您传入方法生成的HtmlStream,并将其作为有效的Xhtml流输出

在HtmlAlityPack中处理此问题的粗略示例如下:

var sb = new StringBuilder(); 
var stringWriter = new StringWriter(sb);

string input = "<html><body><p>This is some test test<ul><li>item 1<li>item2<</ul></body>";

var test = new HtmlAgilityPack.HtmlDocument();
test.LoadHtml(input);
test.OptionOutputAsXml = true;
test.OptionCheckSyntax = true;
test.OptionFixNestedTags = true;

test.Save(stringWriter);

Console.WriteLine(sb.ToString());
var sb=new StringBuilder();
var stringWriter=新的stringWriter(sb);

字符串输入=“这是一些测试项目1
  • 项目2我认为后者可能更好。TinyMCE很不错,但是,我们的应用程序使用ribbon控件来处理所有的格式化命令和快捷方式等。所以我不想用其他元素替换web浏览器。至于HTMLAgilityPack,我听到了很多关于它转换无效HTML的负面消息。所以,我仍然不确定,但会尝试一下。大约一年前,我为一个项目部署了HtmlAgilityPack,简要介绍了采用非w3c标准Html并将其转换为Xhtml。从测试中我可以看出,虽然不是完美的,但我们遇到的主要问题是当我们试图解析嵌套结构(例如列表项中的列表项)时,没有使用结束标记。最终结果是一个有效的DOM,但底层代码强制所有标记只有在它们到达一个不能重叠的元素时才关闭。HtmlAgilityPAck是否能够以字符串而不是实际文件的形式加载内容?我们的应用程序是一个聊天应用程序,我们的输入框只是将HTML存储为要解析的字符串:
    var HTML=webBrowser1.Document.Body.InnerHtml
    。由于它不是一个文档,我没有看到HtmlAgilityPAck的“LoadString”或“FromString”方法。在我的原始答案中添加了一个如何执行此操作的示例。注意,您可以看到我提供的示例文本的一些限制,但是输出应该通过Xhtml验证检查。