【问题标题】:What is the cleanest way to generate HTML in C#?在 C# 中生成 HTML 的最简洁方法是什么?
【发布时间】:2018-07-16 07:15:43
【问题描述】:

我正在尝试制作一个 C# 程序,它接受一个 XML 文件并将其转换为 HTML 文件,最明显的方法是使用 HtmlTextWriter 对象,但我要求需要 6 行代码写一个标签、一个属性、一行内容和一个结束标签。有没有更清洁/更有效的方法来做到这一点?

该程序正在使用 XML 文件(由 XML Schema 定义的格式)来自定义 HTML 模板并用数据填充 HTML 模板。示例如下:

static string aFileName;
static XmlDocument aParser;
static HtmlTextWriter HTMLIOutput;
static StringWriter HTMLIBuffer;
static StreamWriter HTMLOutIFile;
static HtmlTextWriter HTMLEOutput;
static StringWriter HTMLEBuffer;
static StreamWriter HTMLOutEFile;

HTMLIBuffer = new StringWriter();
HTMLIOutput = new HtmlTextWriter(HTMLIBuffer);
XmlElement feed = aParser.DocumentElement;

HTMLIOutput.WriteBeginTag("em");
HTMLIOutput.WriteAttribute("class", "updated");
HTMLIOutput.Write(HtmlTextWriter.TagRightChar);
HTMLIOutput.Write("Last updated: " + 
feed.SelectSingleNode("updated").InnerText.Trim());
HTMLIOutput.WriteEndTag("em");
HTMLIOutput.WriteLine();
HTMLIOutput.WriteLine("<br>");

要写像&lt;em class="updated"&gt;Last updated: 07/16/2018&lt;/em&gt;&lt;br /&gt; 这样的东西,我真的需要有这么多不同的行来构建标签的一部分吗?

注意:是的,我可以直接将内容写入文件,但如果可能我更喜欢更智能的方式,这样人为错误就会更少。

【问题讨论】:

  • 您能否描述一下您要做什么,即您的程序的目的是什么?没有更多细节很难告诉你什么是最好的解决方案。您是否考虑过使用 Razor 引擎?见github.com/Antaris/RazorEngine
  • 您应该考虑可扩展样式表语言转换 (XSLT)。如果你不喜欢这个,试试 HtmlDocument。
  • 在其核心级别,我使用 XML Schema 定义的 XML 文件来自定义包含用户数据的内置 HTML 模板。我将添加一些代码示例。不,此时我只使用基本 C# 功能,但如果需要其他功能,我会使用它。
  • 我会将 XML 字符串反序列化为 C# 对象,然后使用诸如 Razor 引擎(我在之前的评论中提到过)之类的库来生成 HTML。

标签: c#


【解决方案1】:

你总是可以使用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);

System.Xml.Linq:

    var html = new XElement("html",
    new XElement("head",
        new XElement("title", "My Page")
    ),
    new XElement("body",
        "this is some text"
    )
);

【讨论】:

  • 我相信 LINQ 是添加外部库之前的最佳选择,我会尝试的。感谢您提出我完全错过的建议。
【解决方案2】:

在这里使用 Razor 之类的东西不适用吗?因为如果您使用视图引擎进行大量 html 生成,它会变得容易得多。它也是为在 ASP.NET 之外使用而构建的。

但有时这不是您所需要的。您是否考虑过使用属于 .net (mvc) 的 TagBuilder 类? System.Web.UI 中还有HtmlWriter(用于Web 表单)。如果您正在制作 ControlsHtml Helpers,我会推荐其中之一。

【讨论】:

  • 一,到目前为止我还没有听说过Razor,二,因为我要做的只是生成一个静态HTML页面,所以我不需要任何东西花哨的。
  • Razor 的链接似乎已损坏,我在关注时收到“抱歉此页面不存在 =(”。
【解决方案3】:

这是我的建议:

  1. 将 XML 反序列化为 C# 对象
  2. 使用RazorEngine等模板引擎生成HTML

我过去使用RazorEngine 来生成电子邮件模板(HTML 格式)。它们使用与 ASP.NET MVC 视图 (.cshtml) 类似的语法,您甚至可以make intellisense works with the templates!此外,与 XSLT 或 TagBuilder 相比,模板更容易创建和维护。

考虑以下模型:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

您可以使用 HTML 模板创建字符串,或使用文件。我建议使用扩展名为 .cshtml 的文件,这样您就可以进行语法高亮和智能感知,如前所述:

模板文本如下:

@using RazorEngine.Templating
@using RazorDemo1
@inherits TemplateBase<Person>

<div>
    Hello <strong>@Model.FirstName @Model.LastName</strong>
</div>

加载模板并生成 HTML:

using System;
using System.IO;

using RazorEngine;
using RazorEngine.Templating;

namespace RazorDemo1
{
    class Program
    {
        static void Main(string[] args)
        {
            string template = File.ReadAllText("./Templates/Person.cshtml");

            var person = new Person
            {
                FirstName = "Rui",
                LastName = "Jarimba"
            };

            string html = Engine.Razor.RunCompile(template, "templateKey", typeof(Person), person);

            Console.WriteLine(html);
        }
    }
}

输出:

<div>
    Hello <strong>Rui Jarimba</strong>
</div>

【讨论】:

    猜你喜欢
    • 2010-09-23
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2012-01-31
    • 2011-04-10
    • 2012-06-20
    相关资源
    最近更新 更多