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


person Johnny    schedule 02.10.2010    source источник
comment
При чем здесь LINQ to SQL?   -  person svick    schedule 03.10.2010


Ответы (1)


Это эксклюзивная функция VB.NET, известная как XML-литералы. Он был добавлен в VB 9.0. C # в настоящее время не поддерживает эту функцию. Хотя Microsoft заявила о своем намерении преодолеть разрыв между языками в будущем, неясно, появится ли эта функция в C # в ближайшее время.

Мне твой пример не понятен. Вы хотели бы иметь цикл foreach перед синтаксическим анализом фактического XML, поскольку значения привязаны к текущему объекту Person. Например, вот пример XML-литералов на языке VB:

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 из текстового файла и ожидать, что поля будут привязаны таким образом. Для действительно динамического решения, которое позволяет вам написать код один раз и прочитать разные шаблоны, мое первое предложение более уместно.

person Ahmad Mageed    schedule 03.10.2010