Функциональное построение (LINQ to XML)

LINQ to XML предоставляет эффективный способ создания XML-элементов, называемых функциональными конструкциями. Функциональное построение позволяет создавать XML-дерево в одной инструкции.

В функциональном построении используются несколько ключевых функций интерфейса программирования LINQ to XML:

  • Конструктор XElement принимает различные типы аргументов для содержимого. Например, можно передать еще один объект XElement, который станет дочерним элементом. Можно передать объект XAttribute, который станет атрибутом элемента. Можно также передать любой другой тип объекта, который будет преобразован в строку и станет текстовым содержимым элемента.
  • Конструктор XElement принимает массив params типа Object, так что этому конструктору можно передать любое количество объектов. Это позволяет создавать элементы со сложным содержимым.
  • Если объект реализует интерфейс IEnumerable<T>, коллекция в этом объекте перечисляется и добавляются все элементы коллекции. Если коллекция содержит объекты XElement или XAttribute, каждый ее элемент добавляется отдельно. Это важно, так как позволяет передавать результаты запроса LINQ конструктору.

Пример. Создание xml-дерева

Для создания xml-дерева можно использовать функциональное построение. Ниже приведен пример:

XElement contacts =
    new XElement("Contacts",
        new XElement("Contact",
            new XElement("Name", "Patrick Hines"),
            new XElement("Phone", "206-555-0144"),
            new XElement("Address",
                new XElement("Street1", "123 Main St"),
                new XElement("City", "Mercer Island"),
                new XElement("State", "WA"),
                new XElement("Postal", "68042")
            )
        )
    );

Пример. Создание XML-дерева с помощью результатов запроса LINQ

Эти функции также позволяют писать код, который использует результаты запросов LINQ при создании XML-дерева, как показано в следующем примере:

XElement srcTree = new XElement("Root",
    new XElement("Element", 1),
    new XElement("Element", 2),
    new XElement("Element", 3),
    new XElement("Element", 4),
    new XElement("Element", 5)
);
XElement xmlTree = new XElement("Root",
    new XElement("Child", 1),
    new XElement("Child", 2),
    from el in srcTree.Elements()
    where (int)el > 2
    select el
);
Console.WriteLine(xmlTree);

В Visual Basic то же самое выполняется с помощью XML-литерала:

Dim srcTree As XElement = _
    <Root>
        <Element>1</Element>
        <Element>2</Element>
        <Element>3</Element>
        <Element>4</Element>
        <Element>5</Element>
    </Root>
Dim xmlTree As XElement = _
    <Root>
        <Child>1</Child>
        <Child>2</Child>
        <%= From el In srcTree.Elements() _
            Where CInt(el) > 2 _
            Select el %>
    </Root>
Console.WriteLine(xmlTree)

В примере получается следующий вывод.

<Root>
  <Child>1</Child>
  <Child>2</Child>
  <Element>3</Element>
  <Element>4</Element>
  <Element>5</Element>
</Root>

См. также