c# - Schreiben Sie HTML in einen String

Translate

Ich habe solchen Code. Gibt es eine Möglichkeit, das Schreiben und Verwalten zu vereinfachen? Verwenden von 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}", "");
}

Ich könnte auch einfach schreiben:

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

Es wird funktionieren, aber ich muss alle ersetzen"mit"".

This question and all comments follow the "Attribution Required."

Alle Antworten

lc.
Translate

Du bist wahrscheinlich besser dran mit einemHtmlTextWriteroder einXMLWriterals eine EbeneStringWriter. Sie kümmern sich darum, für Sie zu fliehen und sicherzustellen, dass das Dokument gut geformt ist.

Diese Seitezeigt die Grundlagen der Verwendung vonHtmlTextWriterKlasse, deren Kern ist:

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

Wenn ich mich in anderen Sprachen mit diesem Problem befasse, strebe ich eine Trennung von Code und HTML an. Etwas wie:

1.) Erstellen Sie eine HTML-Vorlage. verwenden[varname]Platzhalter zum Markieren von ersetzten / eingefügten Inhalten.
2.) Füllen Sie Ihre Vorlagenvariablen aus einem Array oder einer Struktur / Zuordnung / einem Wörterbuch

Write( FillTemplate(myHTMLTemplate, myVariables) ) # pseudo-code
Quelle
Translate

Ich weiß, dass Sie nach C # gefragt haben, aber wenn Sie bereit sind, eine .NET-Sprache zu verwenden, empfehle ich Visual Basic für genau dieses Problem. Visual Basic verfügt über eine Funktion namens XML-Literale, mit der Sie Code wie diesen schreiben können.

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

Auf diese Weise können Sie direktes HTML mit Ausdruckslöchern im alten ASP-Stil schreiben und Ihren Code super lesbar machen. Leider ist diese Funktion nicht in C # enthalten, aber Sie können ein einzelnes Modul in VB schreiben und es als Referenz zu Ihrem C # -Projekt hinzufügen.

Das Schreiben in Visual Studio ermöglicht auch die korrekte Einrückung für die meisten XML-Literale und Ausdruckswerte. Die Einrückung für die Ausdruckslöcher ist in VS2010 besser.

Quelle
Translate

Benutze einXDocumentUm das DOM zu erstellen, schreiben Sie es mit einem ausXmlWriter. Dies gibt Ihnen eine wunderbar präzise und lesbare Notation sowie eine schön formatierte Ausgabe.

Nehmen Sie dieses Beispielprogramm:

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

Dies erzeugt die folgende Ausgabe:

<!DOCTYPE html >
<html>
    <head />
    <body>
        <p>This paragraph contains <b>bold</b> text.</p>
        <p>This paragraph has just plain text.</p>
    </body>
</html>
Quelle
Translate

Du könntest benutzenSystem.Xml.LinqObjekte. Sie wurden von den alten völlig neu gestaltetSystem.XmlTage, an denen es wirklich ärgerlich war, XML von Grund auf neu zu erstellen.

Anders als der Doctype, denke ich, könnten Sie leicht etwas tun wie:

var html = new XElement("html",
    new XElement("head",
        new XElement("title", "My Page")
    ),
    new XElement("body",
        "this is some text"
    )
);
Quelle
Translate
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);
Quelle
Translate

Am einfachsten ist es, ein XmlWriter-Objekt zu verwenden. Dies kann verwendet werden, um gültiges HTML zu erstellen, und kümmert sich für Sie um alle unangenehmen Escape-Sequenzen.

Quelle
Translate

Sie können verwendenT4-Vorlagenzum Generieren von HTML (oder einem beliebigen) aus Ihrem Code. Sieh dir das an:http://msdn.microsoft.com/en-us/library/ee844259.aspx

Quelle
Translate

Wenn Sie ein HTML-Dokument erstellen möchten, das dem Erstellen eines XML-Dokuments in C # ähnelt, können Sie die Open Source-Bibliothek von Microsoft, dieHTML Agility Pack.

Es stellt ein HtmlDocument-Objekt bereit, das eine sehr ähnliche API wie das hatSystem.Xml.XmlDocumentKlasse.

Quelle
Translate

Sie können ASP.NET verwenden, um Ihren HTML-Code außerhalb des Kontexts von Webseiten zu generieren.Hier ist ein Artikeldas zeigt, wie es geht.

Quelle
Translate

Sie können einige Open-Source-Bibliotheken von Drittanbietern verwenden, um stark typisiertes verifiziertes (X) HTML zu generieren, zCityLizard Frameworkoder Sharp DOM.

AktualisierenZum Beispiel

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"]]
            ]
        ]
    ];
Quelle
Translate

Dies ist jedoch keine generische Lösung. Wenn Ihre Schüler E-Mail-Vorlagen haben oder verwalten sollen, verfügt System.Web über eine integrierte Klasse namensMailDefinition. Diese Klasse wird von den ASP.NET-Mitgliedschaftssteuerelementen zum Erstellen von HTML-E-Mails verwendet.

Ersetzt die gleiche Art von "Zeichenfolge" die oben genannten Dinge, packt jedoch alles in eine MailMessage für Sie.

Hier ist ein Beispiel von MSDN:

ListDictionary replacements = new ListDictionary();
replacements.Add("<%To%>",sourceTo.Text);
replacements.Add("<%From%>", md.From);
System.Net.Mail.MailMessage fileMsg;
fileMsg = md.CreateMailMessage(toAddresses, replacements, emailTemplate, this); 
return fileMsg;
Quelle
Translate

Mit der Einführung von Razor in ASP.net MVC können Sie HTML in C # am besten mit der Razor Engine schreiben.

string templatePath = [email protected]"{Directory.GetCurrentDirectory()}\EmailTemplates"; 

IRazorLightEngine engine = EngineFactory.CreatePhysical(templatePath); 

var model = new Notification 
{ 
       Name = "Jone", 
       Title = "Test Email", 
       Content = "This is a test" 
}; 

string result = engine.Parse("template.cshtml", model); 

Vorlage:

<h2>Dear @Model.Name, you have a notification.</h2> 

<h1>@Model.Title</h1> 
<p>@Model.Content</p> 

<p>Date:@DateTime.Now</p> 

Ein vollständiges Beispiel finden Sie unterHier

Quelle
Translate

Sie können Ihre eigenen Klassen mit der Render-Methode und anderen Attributen schreiben, um ein großes Durcheinander zu vermeiden, wenn Sie sie häufig verwenden, und dann auch den HTMLWriter oder den XML-Writer verwenden. Diese Logik wird auf den asp.net-Seiten verwendet. Sie können von webControl erben und die überschreibenRender-Methode, was großartig ist, wenn Sie serverseitige Steuerelemente entwickeln.
Diesekönnte ein gutes Beispiel sein.

Grüße

Quelle
Translate

Es hängt wirklich davon ab, was Sie wollen und welche Art von Leistung Sie wirklich bieten müssen.

Ich habe bewundernswerte Lösungen für die stark typisierte HTML-Entwicklung gesehen (vollständige Steuerungsmodelle, sei es ASP.NET Web Controls oder ähnliches), die einem Projekt nur erstaunliche Komplexität verleihen. In anderen Situationen ist es perfekt.

In der Reihenfolge der Präferenz in der C # -Welt,

  • ASP.NET-Websteuerelemente
  • ASP.NET-Grundelemente und HTML-Steuerelemente
  • XmlWriter und / oder HtmlWriter
  • Wenn Sie eine Silverlight-Entwicklung mit HTML-Interoperabilität durchführen, sollten Sie etwas in Betracht ziehen, das stark typisiert istLink Text
  • StringBuilder und andere Superprimitive
Quelle
Translate

Ich habe diese Kurse geschrieben, die mir gut gedient haben. Es ist einfach und doch pragmatisch.

public class HtmlAttribute
{
    public string Name { get; set; }
    public string Value { get; set; }

    public HtmlAttribute(string name) : this(name, null) { }

    public HtmlAttribute(
        string name,
        string @value)
    {
        this.Name = name;
        this.Value = @value;
    }

    public override string ToString()
    {
        if (string.IsNullOrEmpty(this.Value))
            return this.Name;

        if (this.Value.Contains('"'))
            return string.Format("{0}='{1}'", this.Name, this.Value);

        return string.Format("{0}=\"{1}\"", this.Name, this.Value);
    }
}

public class HtmlElement
{
    protected List<HtmlAttribute> Attributes { get; set; }
    protected List<object> Childs { get; set; }
    public string Name { get; set; }
    protected HtmlElement Parent { get; set; }

    public HtmlElement() : this(null) { }

    public HtmlElement(string name, params object[] childs)
    {
        this.Name = name;
        this.Attributes = new List<HtmlAttribute>();
        this.Childs = new List<object>();

        if (childs != null && childs.Length > 0)
        {
            foreach (var c in childs)
            {
                Add(c);
            }
        }
    }

    public void Add(object o)
    {
        var a = o as HtmlAttribute;
        if (a != null)
            this.Attributes.Add(a);
        else
        {
            var h = o as HtmlElement;
            if (h != null && !string.IsNullOrEmpty(this.Name))
            {
                h.Parent = this;
                this.Childs.Add(h);
            }
            else
                this.Childs.Add(o);
        }
    }

    public override string ToString()
    {
        var result = new StringBuilder();

        if (!string.IsNullOrEmpty(this.Name))
        {
            result.Append(string.Format("<{0}", this.Name));
            if (this.Attributes.Count > 0)
            {
                result.Append(" ");
                foreach (var attr in this.Attributes)
                {
                    result.Append(attr.ToString());
                    result.Append(" ");
                }

                result = new StringBuilder(result.ToString().TrimEnd(' '));
            }

            if (this.Childs.Count == 0)
            {
                result.Append(" />");
            }
            else
            {
                result.AppendLine(">");

                foreach (var c in this.Childs)
                {
                    var cParts = c.ToString().Split('\n');

                    foreach (var p in cParts)
                    {
                        result.AppendLine(string.Format("{0}", p));
                    }
                }

                result.Append(string.Format("</{0}>", this.Name));
            }
        }
        else
        {
            foreach (var c in this.Childs)
            {
                var cParts = c.ToString().Split('\n');

                foreach (var p in cParts)
                {
                    result.AppendLine(string.Format("{0}", p));
                }
            }
        }

        var head = GetHeading(this);

        var ps = result.ToString().Split('\n');
        return string.Join("\r\n", (from p in ps select head + p.TrimEnd('\r')).ToArray());
    }

    string GetHeading(HtmlElement h)
    {
        if (h.Parent != null)
            return "    ";
        else
            return string.Empty;
    }
}
Quelle
MMA
Translate

HSharp ist eine Bibliothek, mit der Markup-Sprachen wie HTML einfach und schnell analysiert werden können. Installieren:PM> Install-Package Obisoft.HSharp

        var Document = new HDoc(DocumentOptions.BasicHTML);
        Document["html"]["body"].AddChild("div");
        Document["html"]["body"]["div"].AddChild("a", new HProp("href", "/#"));
        Document["html"]["body"]["div"].AddChild("table");
        Document["html"]["body"]["div"]["table"].AddChildren(
         new HTag("tr"),
         new HTag("tr", "SomeText"),
         new HTag("tr", new HTag("td")));
        var Result = Document.GenerateHTML();
        Console.WriteLine(Result);

und Ausgabe:

<html>
<head>
<meta charset="utf-8"></meta><title>
Example </title>
</head>
<body>
<div>
<a href="/#"></a><table>
<tr></tr><tr>
SomeText </tr>
<tr>
<td></td></tr>
</table>
</div>
</body>
</html>
Quelle
Translate

Ich suchte nach etwas, das wie eine Abfrage zum Generieren von Dom in C # aussah (ich muss nicht analysieren). Leider kein Glück, eine einfache Lösung zu finden, also habe ich diese einfache Klasse erstellt, die von System.Xml.Linq.XElement geerbt wird. Das Hauptmerkmal ist, dass Sie den Operator wie bei der Verwendung von jquery in Javascript verketten können, damit er flüssiger ist. Es ist nicht voll ausgestattet, aber es macht das, was ich brauche und wenn es Interesse gibt, kann ich einen Git starten.

public class DomElement : XElement
{
    public DomElement(string name) : base(name)
    {
    }

    public DomElement(string name, string value) : base(name, value)
    {
    }

    public DomElement Css(string style, string value)
    {
        style = style.Trim();
        value = value.Trim();
        var existingStyles = new Dictionary<string, string>();
        var xstyle = this.Attribute("style");
        if (xstyle != null)
        {
            foreach (var s in xstyle.Value.Split(';'))
            {
                var keyValue = s.Split(':');
                existingStyles.Add(keyValue[0], keyValue.Length < 2 ? null : keyValue[1]);
            }
        }

        if (existingStyles.ContainsKey(style))
        {
            existingStyles[style] = value;
        }
        else
        {
            existingStyles.Add(style, value);
        }

        var styleString = string.Join(";", existingStyles.Select(s => $"{s.Key}:{s.Value}"));
        this.SetAttributeValue("style", styleString);

        return this;
    }

    public DomElement AddClass(string cssClass)
    {
        var existingClasses = new List<string>();
        var xclass = this.Attribute("class");
        if (xclass != null)
        {
            existingClasses.AddRange(xclass.Value.Split());
        }

        var addNewClasses = cssClass.Split().Where(e => !existingClasses.Contains(e));
        existingClasses.AddRange(addNewClasses);

        this.SetAttributeValue("class", string.Join(" ", existingClasses));
        return this;
    }

    public DomElement Text(string text)
    {
        this.Value = text;
        return this;
    }

    public DomElement Append(string text)
    {
        this.Add(text);
        return this;
    }

    public DomElement Append(DomElement child)
    {
        this.Add(child);
        return this;
    }
}

Stichprobe:

void Main()
{
    var html = new DomElement("html")
        .Append(new DomElement("head"))
        .Append(new DomElement("body")
            .Append(new DomElement("p")
                .Append("This paragraph contains")
                .Append(new DomElement("b", "bold"))
                .Append(" text.")
                )
            .Append(new DomElement("p").Text("This paragraph has just plain text"))
            )
        ;

    html.ToString().Dump();

    var table = new DomElement("table").AddClass("table table-sm").AddClass("table-striped")
            .Append(new DomElement("thead")
                .Append(new DomElement("tr")
                    .Append(new DomElement("td").Css("padding-left", "15px").Css("color", "red").Css("color", "blue")
                        .AddClass("from-now")
                        .Append(new DomElement("div").Text("Hi there"))
                        .Append(new DomElement("div").Text("Hey there"))
                        .Append(new DomElement("div", "Yo there"))
                        )
                )
            )
        ;
    table.ToString().Dump();
}

Ausgabe vom obigen Code:

<html>
  <head />
  <body>
    <p>This paragraph contains<b>bold</b> text.</p>
    <p>This paragraph has just plain text</p>
  </body>
</html>
<table class="table table-sm table-striped">
  <thead>
    <tr>
      <td style="padding-left:15px;color:blue" class="from-now">
        <div>Hi there</div>
        <div>Hey there</div>
        <div>Yo there</div>
      </td>
    </tr>
  </thead>
</table>
Quelle
Leave a Reply
You must be logged in to post a answer.
Über den Autor