Ответ 1
Я использовал StringTemplate с хорошими результатами. Некоторые ресурсы:
Я ищу автономный, простой в использовании код С#, механизм шаблонов. Я хочу создать файлы HTML и XML с заполнителями для данных, и заполнить их данными из моего кода.
Механизм должен поддерживать циклы (дублирующие части шаблона, содержащие больше одного объекта) и условия (добавить части шаблона в конечный HTML/XML, только если некоторые условия верны). Может ли кто-то рекомендовать мне хороший вариант и добавить ссылку на более или менее такой пример кода и некоторую документацию о том, как использовать рекомендуемый компонент для моих нужд?
Мне также нужно использовать циклы для дублирования строк таблицы или даже целых таблиц (в версии HTML) и сложных элементов (в версии XML).
Я использовал StringTemplate с хорошими результатами. Некоторые ресурсы:
Как насчет T4, Инструментарий преобразования текстовых шаблонов? Он должен соответствовать вашим требованиям и встроен в Visual Studio.
Великие ресурсы T4:
Есть хорошая статья о том, как использовать механизм RazorView: Как создать локализованный механизм текстовых шаблонов с помощью RazorEngine
SmartFormat - довольно простая библиотека, которая отвечает всем вашим требованиям. Он ориентирован на составление текста "естественного языка" и отлично подходит для генерации данных из списков или применения условной логики.
Синтаксис очень похож на String.Format
, и он очень прост и прост в освоении и использовании. Вот пример синтаксиса из документации:
Smart.Format("{Name} friends: {Friends:{Name}|, |, and}", user)
// Result: "Scott friends: Michael, Jim, Pam, and Dwight"
Библиотека с открытым исходным кодом и легко расширяемая, поэтому вы также можете улучшить ее с помощью дополнительных функций.
Вы посмотрели XSLT? Вам нужно будет начать с вашего исходного формата данных в XML, возможно, путем xmlserializing ваших объектов данных. Вы можете сделать циклы и если утверждения с легкостью!
Кэтлин Доллард книга по генерации кода через XSLT.
Лично я большой поклонник T4 (особенно при создании С#), но вы можете обнаружить, что, поскольку XML и HTML являются ваши типы выпуска XSLT вы покрыли. Плюс это очень кросс-платформенный.
У меня есть механизм шаблонов, встроенный в мою библиотеку классов, которая выглядит и работает аналогично ASP в старом стиле или T4.
Вы в основном пишете код С# в блоках <%% > и, таким образом, можете делать большинство вещей, которые может выполнять С#, с ограничением, что весь файл шаблона скомпилирован для одного метода. Другими словами, вы не можете определять вспомогательные классы и такие внутри шаблона, но для вспомогательных методов вы можете делать анонимные методы.
Пример:
<%
var firstname = "Bob";
var count = 10;
for (Int32 index = 0; index < count; index++)
{
%>
<%= firstname %> x <%= index+1 %>/<%= count %>
<%
}
%>
Затем он будет скомпилирован в класс С# в другом appdomain и может быть выполнен для возврата строки, содержащей полученный текст.
Вы также можете передать аргумент в шаблон, а также библиотеки ссылочных классов, что означает, что вы можете передавать пользовательские структуры данных или получать доступ к уровню доступа к данным или коду бизнес-логики из вашего шаблона.
Если вы хотите посмотреть на него, код доступен в моей библиотеке классов из моего репозитория Subversion или веб-страницы:
Для репозитариев subversion вам нужно имя пользователя и пароль, оба являются "гостями", без кавычек.
Код находится в проекте/сборке LVK.Text.Templating.
Также дайте мне знать (см. электронную почту на странице профиля или оставьте комментарий), и я приведу вам еще несколько примеров.
Вам может понадобиться .NET Template Engine.
Код шаблона:
$Book.StaticId$
ID: $bk.BookId$ - Author: $bk.Author.Name$
Length of the author Name: $bk.Author.Name.Length$
Код С#:
class Author
{
public string Name
{
get
{
return "John Borders";
}
}
}
class Book
{
public static string StaticId
{
get
{
return "AABB";
}
}
public int BookId
{
get
{
return 100;
}
}
public Author Author
{
get
{
return new Author();
}
}
}
public class PropertySample1
{
[STAThread]
static void Main()
{
TemplateEngine dt = new TemplateEngine();
dt.LoadFromFile("Template.tpl");
Book book = new Book();
dt.SetValue("bk", book);
dt.UsingNamespace("CSharp,Demo");
string output = dt.Run();
Console.WriteLine(output);
}
}
Выход:
AABB
ID: 100 - Author: John Borders
12