Поделиться через


Создание XML-деревьев в C# (LINQ to XML)

В этом разделе размещены сведения о создании XML-деревьев при помощи языка C#.

Для получения дополнительных сведений об использовании результатов LINQ в качестве содержимого для XElement см.Функциональное построение (LINQ to XML).

Построение элементов

Сигнатуры конструкторов XElement и XAttribute позволяют передать конструктору содержимое элемента или атрибута в качестве аргументов. Поскольку один из конструкторов принимает переменное количество аргументов, можно пропустить любое количество дочерних элементов. Естественно, каждый из этих дочерних элементов может содержать собственные дочерние элементы. Для любого элемента можно добавить любое количество атрибутов.

При добавлении объектов XNode (в т. ч. XElement) или XAttribute, если новое содержимое не обладает родительской структурой, объекты просто прикрепляются к XML-дереву. Если у нового содержимого уже есть родитель и оно является частью другого XML-дерева, то новое содержимое клонируется и присоединяется к XML-дереву. Это демонстрирует последний пример из данного раздела.

Чтобы создать contacts XElement, можно использовать следующий код:

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")
            )
        )
    );

Если цель определена верно, то код для создания объектов XElement становится похож на структуру соответствующего XML.

Visual Basic использует другой подход к созданию XML-деревьев, позволяя внедрить XML-код напрямую в программу Visual Basic в качестве литерала. Для получения дополнительной информации см. Введение в XML-литералы в Visual Basic.

Конструкторы XElement

В классе XElement используются следующие конструкторы для функционального построения. Обратите внимание, что существуют другие конструкторы для XElement, однако, поскольку они не используются для функциональных построений, они здесь не приводятся.

Конструктор

Описание

XElement(XName name, object content)

Создает XElement. Параметр name задает имя элемента; content задает содержание элемента.

XElement(XName name)

Создает XElement с инициализацией XName в соответствии с указанным именем.

XElement(XName name, params object[] content)

Создает XElement с инициализацией XName в соответствии с указанным именем. Атрибуты и/или дочерние элементы создаются из содержимого списка параметров.

Параметр content чрезвычайно гибок. Он поддерживает любой тип объекта, который является действительным дочерним объектом XElement. К различным типам объектов, передающимся в этом параметре, применимы следующие правила.

  • Строка добавляется как текстовое содержимое.

  • XElement добавляется к дочернему элементу.

  • XAttribute добавляется как атрибут.

  • XProcessingInstruction, XComment или XText добавляется в качестве дочернего содержимого.

  • IEnumerable перечисляется, и эти правила рекурсивно применяются к результатам.

  • Для любого другого типа вызывается метод ToString, при этом результат добавляется как текстовое содержимое.

Создание элемента XElement с содержимым (Content)

Можно создать XElement с простым содержимым при помощи одного вызова метода. Чтобы это сделать, укажите содержимое в качестве второго параметра следующим образом:

XElement n = new XElement("Customer", "Adventure Works");
Console.WriteLine(n);

В этом примере выводятся следующие данные:

<Customer>Adventure Works</Customer>

Содержимому можно передать любой тип объекта. Например, в следующем коде выполняется создание элемента, в котором в качестве содержимого содержится число с плавающей запятой:

XElement n = new XElement("Cost", 324.50);
Console.WriteLine(n);

В этом примере выводятся следующие данные:

<Cost>324.5</Cost>

Число с плавающей запятой помещается в контейнер и передается конструктору. Это число в контейнере преобразуется в строку и используется в качестве содержимого элемента.

Создание элемента XElement с дочерним элементом

Если передать экземпляр класса XElement как аргумент содержимого, конструктор создаст элемент с дочерним элементом:

XElement shippingUnit = new XElement("ShippingUnit",
    new XElement("Cost", 324.50)
);
Console.WriteLine(shippingUnit);

В этом примере выводятся следующие данные:

<ShippingUnit>
  <Cost>324.5</Cost>
</ShippingUnit>

Создание элемента XElement с несколькими дочерними элементами

Можно передать некоторое количество объектов XElement в качестве содержимого. Каждый из объектов XElement включается в качестве дочернего элемента.

XElement address = new XElement("Address",
    new XElement("Street1", "123 Main St"),
    new XElement("City", "Mercer Island"),
    new XElement("State", "WA"),
    new XElement("Postal", "68042")
);
Console.WriteLine(address);

В этом примере выводятся следующие данные:

<Address>
  <Street1>123 Main St</Street1>
  <City>Mercer Island</City>
  <State>WA</State>
  <Postal>68042</Postal>
</Address>

Расширив предыдущим пример, можно создать все 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")
            )
        )
    );
Console.WriteLine(contacts);

В этом примере выводятся следующие данные:

<Contacts>
  <Contact>
    <Name>Patrick Hines</Name>
    <Phone>206-555-0144</Phone>
    <Address>
      <Street1>123 Main St</Street1>
      <City>Mercer Island</City>
      <State>WA</State>
      <Postal>68042</Postal>
    </Address>
  </Contact>
</Contacts>

Создание пустого элемента

Чтобы создать пустой элемент XElement, нужно просто не передавать никакого содержимого в конструктор. На следующем примере показано создание пустого элемента:

XElement n = new XElement("Customer");
Console.WriteLine(n);

В этом примере выводятся следующие данные:

<Customer />

Сравнение присоединения иклонирования

Как упоминалось ранее, при добавлении объектов XNode (в т. ч. XElement) или XAttribute, если новое содержимое не обладает родительской структурой, объекты просто прикрепляются к XML-дереву. Если у нового содержимого уже есть родитель и оно является частью другого XML-дерева, то новое содержимое клонируется и присоединяется к XML-дереву.

// Create a tree with a child element.
XElement xmlTree1 = new XElement("Root",
    new XElement("Child1", 1)
);

// Create an element that is not parented.
XElement child2 = new XElement("Child2", 2);

// Create a tree and add Child1 and Child2 to it.
XElement xmlTree2 = new XElement("Root",
    xmlTree1.Element("Child1"),
    child2
);

// Compare Child1 identity.
Console.WriteLine("Child1 was {0}",
    xmlTree1.Element("Child1") == xmlTree2.Element("Child1") ?
    "attached" : "cloned");

// Compare Child2 identity.
Console.WriteLine("Child2 was {0}",
    child2 == xmlTree2.Element("Child2") ?
    "attached" : "cloned");

В этом примере выводятся следующие данные:

Child1 was cloned
Child2 was attached

См. также

Основные понятия

Создание XML-деревьев