Написать HTML в C # - PullRequest
44 голосов
/ 17 июня 2009

У меня есть такой код. Есть ли способ облегчить написание и поддержку? Использование C # .NET 3.5

string header(string title)
{
    StringWriter s = new StringWriter();
    s.WriteLine("{0}","<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">");
    s.WriteLine("{0}", "<html>");
    s.WriteLine("<title>{0}</title>", title);
    s.WriteLine("{0}","<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">");
    s.WriteLine("{0}", "</head>");
    s.WriteLine("{0}", "<body>");
    s.WriteLine("{0}", "");
}

-edit- я тогда не знал, но я мог написать

s.WriteLine("{0}", @"blah blah

many
new
lines
blah UHY#$&_#$_*@Y KSDSD<>\t\t\t\t\t\tt\t\t\\\t\t\t\t\\\h\th'\h't\th
hi
done"); 

и это будет работать, но нужно заменить все "на" "

Ответы [ 17 ]

83 голосов
/ 17 июня 2009

Возможно, вам лучше использовать HtmlTextWriter или XMLWriter, чем обычную StringWriter. Они позаботятся о том, чтобы вас убежать, а также позаботятся о том, чтобы документ был правильно оформлен.

На этой странице показаны основы использования класса HtmlTextWriter, суть которого:

StringWriter stringWriter = new StringWriter();

using (HtmlTextWriter writer = new HtmlTextWriter(stringWriter))
{
    writer.AddAttribute(HtmlTextWriterAttribute.Class, classValue);
    writer.RenderBeginTag(HtmlTextWriterTag.Div); // Begin #1

    writer.AddAttribute(HtmlTextWriterAttribute.Href, urlValue);
    writer.RenderBeginTag(HtmlTextWriterTag.A); // Begin #2

    writer.AddAttribute(HtmlTextWriterAttribute.Src, imageValue);
    writer.AddAttribute(HtmlTextWriterAttribute.Width, "60");
    writer.AddAttribute(HtmlTextWriterAttribute.Height, "60");
    writer.AddAttribute(HtmlTextWriterAttribute.Alt, "");

    writer.RenderBeginTag(HtmlTextWriterTag.Img); // Begin #3
    writer.RenderEndTag(); // End #3

    writer.Write(word);

    writer.RenderEndTag(); // End #2
    writer.RenderEndTag(); // End #1
}
// Return the result.
return stringWriter.ToString();
23 голосов
/ 17 июня 2009

Когда я решаю эту проблему на других языках, я делаю код и HTML. Что-то вроде:

1.) Создайте шаблон HTML. используйте [varname] заполнители для пометки замененного / вставленного содержимого.
2.) Заполните ваш шаблон переменных из массива или структуры / отображения / словаря

Write( FillTemplate(myHTMLTemplate, myVariables) ) # pseudo-code
13 голосов
/ 17 июня 2009

Я знаю, что вы спрашивали о C #, но если вы хотите использовать любой язык .Net, тогда я настоятельно рекомендую Visual Basic для этой конкретной проблемы. В Visual Basic есть функция XML Literal, которая позволит вам писать такой код.

Module Module1

    Sub Main()

        Dim myTitle = "Hello HTML"
        Dim myHTML = <html>
                         <head>
                             <title><%= myTitle %></title>
                         </head>
                         <body>
                             <h1>Welcome</h1>
                             <table>
                                 <tr><th>ID</th><th>Name</th></tr>
                                 <tr><td>1</td><td>CouldBeAVariable</td></tr>
                             </table>
                         </body>
                     </html>

        Console.WriteLine(myHTML)
    End Sub

End Module

Это позволяет вам писать прямой HTML с дырами в старом стиле ASP и делает ваш код супер читабельным. К сожалению, эта функция отсутствует в C #, но вы можете написать один модуль в VB и добавить его в качестве ссылки на ваш проект C #.

Запись в Visual Studio также позволяет создавать правильные отступы для большинства литералов XML и целых выражений. Отступ для отверстий выражения лучше в VS2010.

11 голосов
/ 09 января 2015

Используйте XDocument для создания DOM, затем запишите его, используя XmlWriter. Это даст вам удивительно краткую и удобочитаемую запись, а также красиво отформатированный вывод.

Возьмите этот пример программы:

using System.Xml;
using System.Xml.Linq;

class Program {
    static void Main() {
        var xDocument = new XDocument(
            new XDocumentType("html", null, null, null),
            new XElement("html",
                new XElement("head"),
                new XElement("body",
                    new XElement("p",
                        "This paragraph contains ", new XElement("b", "bold"), " text."
                    ),
                    new XElement("p",
                        "This paragraph has just plain text."
                    )
                )
            )
        );

        var settings = new XmlWriterSettings {
            OmitXmlDeclaration = true, Indent = true, IndentChars = "\t"
        };
        using (var writer = XmlWriter.Create(@"C:\Users\wolf\Desktop\test.html", settings)) {
            xDocument.WriteTo(writer);
        }
    }
}

Создает следующий вывод:

<!DOCTYPE html >
<html>
    <head />
    <body>
        <p>This paragraph contains <b>bold</b> text.</p>
        <p>This paragraph has just plain text.</p>
    </body>
</html>
6 голосов
/ 17 июня 2009

Вы можете использовать System.Xml.Linq объекты. Они были полностью переработаны со старых System.Xml дней, которые делали создание XML с нуля действительно раздражающим.

За исключением типа документа, я думаю, вы могли бы легко сделать что-то вроде:

var html = new XElement("html",
    new XElement("head",
        new XElement("title", "My Page")
    ),
    new XElement("body",
        "this is some text"
    )
);
5 голосов
/ 17 февраля 2014

Вы можете использовать Шаблоны T4 для создания HTML (или любого другого) из вашего кода. смотри это: http://msdn.microsoft.com/en-us/library/ee844259.aspx

5 голосов
/ 17 июня 2009
return string.Format(@"<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01//EN""      ""http://www.w3.org/TR/html4/strict.dtd"">
<html>
<title>{0}</title>
<link rel=""stylesheet"" type=""text/css"" href=""style.css"">
</head>
<body>
", title);
4 голосов
/ 17 июня 2009

Самый простой способ - использовать объект XmlWriter. Это может быть использовано для создания корректного HTML и позаботится обо всех неприятных escape-последовательностях для вас.

2 голосов
/ 18 октября 2010

Вы можете использовать сторонние библиотеки с открытым исходным кодом для создания строго типизированного проверенного (X) HTML, например CityLizard Framework или Sharp DOM.

Обновление Например

html
    [head
        [title["Title of the page"]]
        [meta_(
            content: "text/html;charset=UTF-8",
            http_equiv: "Content-Type")
        ]
        [link_(href: "css/style.css", rel: "stylesheet", type: "text/css")]
        [script_(type: "text/javascript", src: "/JavaScript/jquery-1.4.2.min.js")]
    ]
    [body
        [div
            [h1["Test Form to Test"]]
            [form_(action: "post", id: "Form1")
                [div
                    [label["Parameter"]]
                    [input_(type: "text", value: "Enter value")]
                    [input_(type: "submit", value: "Submit!")]
                ]
            ]
            [div
                [p["Textual description of the footer"]]
                [a_(href: "http://google.com/")
                    [span["You can find us here"]]
                ]
                [div["Another nested container"]]
            ]
        ]
    ];
2 голосов
/ 17 июня 2009

Если вы хотите создать документ HTML, аналогичный тому, как вы создавали бы документ XML в C #, вы можете попробовать библиотеку Microsoft с открытым исходным кодом, Html Agility Pack .

Он предоставляет объект HtmlDocument, который имеет API, очень похожий на класс System.Xml.XmlDocument.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...