2011-06-22 10 views
4

編集モードでwebBrowserコントロールを使用して、人々がテキストを入力してから、そのテキストを取り出してみんなに見せるためにサーバーに送ります。 IE、それはHTML入力ボックスです。WebBrowserから有効なXHTMLへの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(); 
    } 

I基本的にPASE HTML文字列を、それが返され、適切なXHTML 'をsuposed'。しかし、それはXHTMLのチェックを通過していないし、それが返すデータは単なる基本的なものです。

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

フォーマット。したがって、適切なXHTMLではありません。

実際に適切なXHTMLを出力するにはどうすればよいですか? SGMLドキュメントのMindSharesサイトにはそれほど多くのことはないので、ここからどこに行くのかは分かりません。

本質的に、有効なXHTMLではないWebBrowserコントロールからのHTMLが、XHTMLに出力するために、XMPP.msg.Html要素(有効なXHTMLのみ)に添付できるようにする必要があります。 HTML内のコードが無効であることがシステムによって検出された場合は、XMPP.msg.Htmlが空白としてマークされます。したがって、上記のメソッドが動作していないことがわかります。

ありがとうございます!

答えて

9

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

私は後が良いかもしれないと思います。 TinyMCEは素晴らしいですが、私たちのアプリケーションでは、リボンコントロールを使ってすべての書式設定コマンドやショートカットなどを処理します。したがって、Webブラウザを別の要素に置き換えたくありません。 HTMLAgilityPackに関しては、私は無効なHTMLを変換することに関してかなりの否定的なことを聞​​いてきました。だから私はまだ不確実ですが、試してみることにします。 –

+0

私は約1年前に、w3c以外の標準HTMLをとり、それをXhtmlに変換する簡単な作業のために、HtmlAgilityPackをプロジェクトに配備しました。私が遭遇した主な問題は、閉じたタグが使用されていないネストされた構造(リスト項目内のリスト項目など)を解析しようとしたときでした。最終的な結果は有効なDOMでしたが、基になるコードは、すべてのタグが重複しない要素に到達したときにのみ閉じるようにしました。 – Pooli

+0

HtmlAgilityPAckは、実際のファイルではなく文字列としてコンテンツをロードできますか?私たちのアプリケーションはチャットアプリケーションであり、入力ボックスは単にHTMLを解析する文字列として保存します: 'var html = webBrowser1.Document.Body.InnerHtml'など。ドキュメントではないので、HtmlAgilityPAckの 'LoadString'または 'FromString'メソッドは表示されません。 –

関連する問題