如何从 WebBrowser Control 更正无效的 HTML?

How to correct invalid HTML from WebBrowser Control?

我正在使用 WebBrowser 控件作为文本编辑器。在用户输入或编辑一些文本并关闭编辑器后,我解析属性 webBrowser1.Document.Body.OuterHtml 的内容,为另一个应用程序创建一些文本对象。

然而,解析器只适用于有效的 HTML,正如我所想的,WebBrowser 控件只会产生有效的 HTML。不幸的是,通过在编辑器中进行一些复制和粘贴,我能够生成以下内容 HTML:

<BODY {...some Attributes...}>
    <P align=left>
        <FONT size=7>
            some text
            <FONT color=#00b700>
                more text
            </FONT>
            <FONT color=#ff0000>
                text
                <FONT size=7>
                    text
                    <FONT color=#00b700>
                        text
                    </FONT>
                    <FONT color=#ff0000>
                        text
                    </FONT>
                </FONT>
            </P>
        </FONT>
    </FONT>
</BODY>

如您所见,结束的 p-Tag 似乎与结束的 font-Tag 交换了。在 WebBrowser 控件中,一切看起来都很好,但我编写的解析器无法处理 HTML。 (在解析器中,我提取所有文本节点,并从每个节点爬上 DOM-树,直到到达正文节点,沿途寻找文本格式)。另外 HtmlAgilityPack 说 p-Node 的 InnerHtml 是空的。

有什么神奇的方法可以自动更正 "slightly" 无效 HTML 吗?

经过进一步搜索,我发现 http://corsis.sourceforge.net/index.php/Html2Xhtml

工作起来很有魅力,完全符合我的要求:

Html 来自 WebBrowser 控件:

<BODY >
    <P align=left>
        <FONT size=7>
            11111&nbsp;2222
            <FONT color=#00b700>

            </FONT>
            <FONT color=#ff0000>
                ?????
                <FONT size=7>
                    11111&nbsp;2222
                    <FONT color=#00b700>

                    </FONT>
                    <FONT color=#ff0000>
                        ?????
                    </FONT>
                </FONT>
            </P>
        </FONT>
    </FONT>
</BODY>

更正为 Html2Xhtml:

<body>
    <p align=\"left\">
        <font size=\"7\">
            11111&nbsp;2222
            <font color=\"#00b700\">

            </font>
            <font color=\"#ff0000\">
                ????? 
                <font size=\"7\">
                    11111&nbsp;2222
                    <font color=\"#00b700\">

                    </font>
                    <font color=\"#ff0000\">
                        ?????
                    </font>
                </font>
            </font>
        </font>
    </p>
</body>

太棒了!