LINQ to SQL to XML (с использованием литералов XML в C#)
Можно ли использовать такие переменные, как <%=person.LastName %>
в XML-строке таким образом?
XElement letters = new XElement("Letters");
XElement xperson = XElement.Parse("<Table><Row><Cell><Text>
<Segment>Dear <%=person.Title%> <%=person.FirstName%> <%=person.LastName%>,
</Segment></Text></Cell></Row>...");
foreach (Person person in persons){
letters.Add(xperson)
}
Если это возможно, это было бы спасением, поскольку я не могу использовать XElement и XAttribute для добавления узлов вручную. У нас есть несколько шаблонов, и они часто меняются (редактируйте на лету).
Если это не выполнимо, можете ли вы придумать другой способ, чтобы я мог использовать шаблоны для XML?
Похоже, это возможно в VB http://aspalliance.com/1534_Easy_SQL_to_XML_with_LINQ_and_Visual_Basic_2008.6
1 ответ
Это эксклюзивная функция VB.NET, известная как XML Literals. Это было добавлено в VB 9.0. C# в настоящее время не поддерживает эту функцию. Хотя Microsoft заявляет о своем намерении сократить разрыв между языками в будущем, неясно, сможет ли эта функция появиться в C# в ближайшее время.
Ваш пример не кажется мне понятным. Вы хотели бы иметь foreach
цикл перед анализом фактического XML, так как значения привязаны к текущему Person
объект. Например, вот пример VB XML-литералов:
Dim xml = <numbers>
<%= From i In Enumerable.Range(1, 5)
Select <number><%= i %></number>
%>
</numbers>
For Each e In xml.Elements()
Console.WriteLine(e.Value)
Next
Приведенный выше фрагмент создает следующий XML:
<numbers>
<number>1</number>
<number>2</number>
<number>3</number>
</numbers>
Потом пишет 1, 2, 3
на консоль.
Если вы не можете изменить свой код C# для динамического построения XML, то, возможно, вы могли бы написать код, который пересекает шаблон XML и ищет предопределенные поля в атрибутах и элементах, а затем устанавливает необходимые значения. Это означает, что вам придется перебирать все атрибуты и элементы в каждом узле и иметь некоторую инструкцию switch, которая проверяет имя поля шаблона. Если вы сталкиваетесь с полем шаблона и в настоящее время итерируете атрибуты, вы устанавливаете его так, как задаются атрибуты, тогда как, если вы перебираете элементы, вы устанавливаете его так, как задаются элементы. Это, вероятно, не самый эффективный подход, но является одним из решений.
Самое простое решение - использовать VB.NET. Вы всегда можете разработать его как самостоятельный проект, добавить ссылку на dll из проекта C#, передать данные в класс VB.NET и вернуть ему окончательный XML.
РЕДАКТИРОВАТЬ: чтобы уточнить, использование VB.NET не обходит необходимость обновления шаблона. Это позволяет вам проще указать макет в виде литерала XML. Таким образом, код все еще должен быть обновлен в VB после изменения макета. Вы не можете загрузить шаблон XML из текстового файла и ожидать, что поля будут связаны таким образом. Для действительно динамичного решения, которое позволяет вам написать код один раз и прочитать разные шаблоны, мое первое предложение более уместно.