【问题标题】:C# HTML from WebBrowser to valid XHTML从 WebBrowser 到有效 XHTML 的 C# HTML
【发布时间】:2011-09-20 18:01:25
【问题描述】:

因此,我们在编辑模式下使用 webBrowser 控件,以允许人们输入文本,然后将该文本发送到服务器以供所有人查看。 IE,是一个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 字符串粘贴到该方法中,它会返回“假定”正确的 XHTML。但是,它没有通过 XHTML 检查,它返回的数据只是一个基本的

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

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

那么,我怎样才能格式化它以实际输出正确的 XHTML? MindShares 网站上没有太多 SGML 文档了,所以不知道从哪里开始。

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

谢谢!

【问题讨论】:

    标签: c# html xhtml browser xmpp


    【解决方案1】:

    建议使用 TinyMCE 或 HtmlAgilityPack(可作为 Nuget 包或来自 codeplex)之类的东西。

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

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

    在 HtmlAgilityPAck 中使用它的粗略示例如下:

    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());
    

    【讨论】:

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