3

ディレクトリ内のすべてのdllファイルとそのバージョンの電子メールをプログラムで再帰的に送信しようとしています。テーブルを使用して、HTML出力としてメールを送信したいと思います。これを行うための良いオブジェクト指向の方法はありますか?すべてのタグを手で書くのは嫌です。

何かのようなもの:

private string getHTMLString()
{
    DirectoryInfo di = new DirectoryInfo("some directory");
    FileInfo[] files = di.GetFiles("*.dll", SearchOption.AllDirectories);
    foreach (FileInfo file in files)
    {
        Assembly assembly = Assembly.LoadFile(file.FullName);
        string version = assembly.GetName().Version.ToString();
    }
 }
4

8 に答える 8

8

System.Web.UI.WebControls.Tableをインスタンス化し、TableRowsとTableCellsを追加してから、Table.RenderControlをHtmlTextWriterに呼び出すことで、OOを実行できますが、公平を期すために:)

        var tbl = new System.Web.UI.WebControls.Table();

        DirectoryInfo di = new DirectoryInfo("some directory");
        FileInfo[] files = di.GetFiles("*.dll", SearchOption.AllDirectories);
        foreach (FileInfo file in files)
        {
            Assembly assembly = Assembly.LoadFile(file.FullName);
            string version = assembly.GetName().Version.ToString();

            var tr = new System.Web.UI.WebControls.TableRow();
            var tc = new System.Web.UI.WebControls.TableCell();
            tc.Text = HttpUtility.HtmlEncode(version);
            tr.Cells.Add(tc);
            tbl.Rows.Add(tr);
        }

        using (var ts = new StringWriter())
        using (var html = new System.Web.UI.HtmlTextWriter(ts))
        {
            // Not entirely sure about this part
            tbl.RenderControl(html);
            html.Flush();
            string htmlString = ts.ToString();
        }
于 2010-01-05T00:11:20.873 に答える
7

実際に「<」と「>」を手書きしなくても、実際にHtmlTextWriterを使用し、HtmlTextWriterTag列挙型を使用してタグを作成できます。

例:

StringBuilder sb = new StringBuilder();

using (HtmlTextWriter w = new HtmlTextWriter(new StringWriter(sb)))
{
      w.RenderBeginTag(HtmlTextWriterTag.P);

      w.AddStyleAttribute(HtmlTextWriterStyle.Color, "red");

      w.RenderBeginTag(HtmlTextWriterTag.Span);

      w.Write("This is some text");

      w.RenderEndTag();

      w.RenderEndTag();
 }

 string html = sb.ToString();

HTMLが自動的に作成されるわけではありませんが、「よりOO」な方法でHTMLを作成するのに役立ち、有効なHTMLを作成するのに役立ちます(確実ではありません)(すべてのタグに終了タグがあるなど)。

于 2010-01-05T00:03:48.673 に答える
7

やり過ぎかもしれませんが、LINQ to XMLを使用してHTML文字列を生成できます...これが、LINQとXElementを使用して単純なテーブルを生成するコードです。

注意する必要があるのは、HTMLの自動終了タグとして無効な空のタグだけです。たとえば、空のTD:は、有効なHTMLではないものnew XElement("td")としてレンダリングされます。<td/>これを修正するには、コンテンツとして空の文字列を挿入します。-これにより、new XElement("td", String.Empty)が出力されます<td></td>

private string GetHtmlString()
{
    DirectoryInfo di = new DirectoryInfo("some directory");
    FileInfo[] files = di.GetFiles("*.dll", SearchOption.AllDirectories);

    var container = new XElement("table",
        from file in files
        let assembly = Assembly.LoadFile(file.FullName)
        select new XElement("tr", 
            new XElement("td", file.FullName),
            new XElement("td", assembly.GetName().Version.ToString())
        )
    );

    return container.ToString();
 }
于 2010-01-05T00:08:28.177 に答える
5

このようなもの?

private string getHTMLString()
{
    DirectoryInfo di = new DirectoryInfo("some directory");
    FileInfo[] files = di.GetFiles("*.dll", SearchOption.AllDirectories);
    StringBuilder sb = new StringBuilder();
    sb.Append("<table>");
    foreach (FileInfo file in files)
    {
        Assembly assembly = Assembly.LoadFile(file.FullName);
        string version = assembly.GetName().Version.ToString();
        sb.AppendFormat("<tr><td>{0}</td><td>{1}</td></tr>", file.FullName, version);
    }
    sb.Append("</table>");
    return sb.ToString();

 }

実際には「オブジェクト指向」ではありませんが、私は最も論理的だと主張します。

免責事項:手作業で編集

于 2010-01-04T23:53:32.377 に答える
2

タグはタグです。あなたはそれらを書かなければならないでしょう。

HtmlTextWriterを使用して実際の書き込みを行うことができますが、それを回避する魔法の方法はありません。

于 2010-01-04T23:50:50.123 に答える
1

あなたがしていることは、文字列バッファを使って手作業で行うのに十分簡単に​​思えます。これがもっと複​​雑な場合は、StringTemplateなどのテンプレートエンジンを使用することをお勧めします。

于 2010-01-04T23:57:09.607 に答える
1

XmlWriterを使用して、これをよりOO形式で行うことができます。

StringBuilder sb = new StringBuilder();
XmlWriter xmlWri = XmlWriter.Create(sb);
xmlWri.WriteStartElement("html");
{
    xmlWri.WriteStartElement("body");
    {
        xmlWri.WriteAttributeString("bgcolor", "black");

        // More html stuff
    }
    xmlWri.WriteEndElement(); // body
}
xmlWri.WriteEndElement(); // html
xmlWri.Flush();
xmlWri.Close();
string html = sb.ToString();

編集:これを行うのはかなり面倒です。将来、HTMLコンテンツを変更したい場合は、コードで変更する必要があります。より良い方法は、テーブルの列にマップするプレースホルダーを含む事前にフォーマットされたHTMLドキュメントを読み取ることです。したがって、必要なのは、すべての列をループして、その場所に対して検索/置換を行う方法だけです。 -HTMLドキュメントのホルダー。

于 2010-01-04T23:57:43.693 に答える
0

私は現在、その問題に正確に取り組むライブラリを書いています。コレクション初期化子を使用してHTMLを作成できるため、かなり簡潔にすることができます。また、CSSスタイル、オプションのパラメーターとしての要素属性などもサポートしています。LGPLであるため、どこでも使用できます。

コードは次のようになります。

private string getHTMLString()
{
    DirectoryInfo di = new DirectoryInfo("some directory");
    FileInfo[] files = di.GetFiles("*.dll", SearchOption.AllDirectories);

    var table = new Table();

    foreach (FileInfo file in files)
    {
        Assembly assembly = Assembly.LoadFile(file.FullName);
        string version = assembly.GetName().Version.ToString();

        table.Add(new Tr { new Td { file.FullName }, new Td { version } });
    }

    return table.Render();
}

SourceForgeのHTML++

于 2012-04-12T18:17:40.530 に答える