LINQ to SQL to XML (с использованием литералов XML в C #) - PullRequest
2 голосов
/ 02 октября 2010

Можно ли таким образом использовать переменные типа <%=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 Ответ

1 голос
/ 03 октября 2010

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

...