Создание документа с пространствами имен в C# (LINQ to XML)

В этой статье показано, как создавать документы в C# с пространствами имен.

Пример. Объявление и инициализация пространства имен по умолчанию

Чтобы создать элемент или атрибут, который находится в пространстве имен, сначала объявите и инициализируете XNamespace объект. Затем следует использовать перегруженный оператор сложения для объединения пространства имен с локальным именем, выраженным строкой.

В следующем примере создается документ с одним пространством имен. По умолчанию LINQ to XML сериализует этот документ с пространством имен по умолчанию.

// Create an XML tree in a namespace.
XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
    new XElement(aw + "Child", "child content")
);
Console.WriteLine(root);

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

<Root xmlns="http://www.adventure-works.com">
  <Child>child content</Child>
</Root>

Пример. Создание документа с пространством имен и атрибутом

В следующем примере создается документ с одним пространством имен. Он также создает атрибут, который объявляет пространство имен с префиксом пространства имен. Создать атрибут, объявляющий пространство имен с префиксом, можно, указав имя атрибута в качестве префикса пространства имен и поместив его в пространство имен Xmlns. Значение этого атрибута представляет собой URI пространства имен.

// Create an XML tree in a namespace, with a specified prefix
XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
    new XAttribute(XNamespace.Xmlns + "aw", "http://www.adventure-works.com"),
    new XElement(aw + "Child", "child content")
);
Console.WriteLine(root);

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

<aw:Root xmlns:aw="http://www.adventure-works.com">
  <aw:Child>child content</aw:Child>
</aw:Root>

Пример. Создание документа с двумя пространствами имен, одним из них с префиксом

Следующий пример иллюстрирует создание документа, содержащего два пространства имен. Одно из них — это пространство имен по умолчанию, а другое — пространство имен с префиксом.

Включив атрибуты пространства имен в корневой элемент, пространства имен сериализуются таким образом, чтобы http://www.adventure-works.com это пространство имен по умолчанию и www.fourthcoffee.com сериализулось с префиксом fc. Чтобы создать атрибут, объявляющий пространство имен по умолчанию, создайте атрибут с именем xmlnsбез пространства имен. Значение этого атрибута является используемым по умолчанию идентификатором URI пространства имен.

// The http://www.adventure-works.com namespace is forced to be the default namespace.
XNamespace aw = "http://www.adventure-works.com";
XNamespace fc = "www.fourthcoffee.com";
XElement root = new XElement(aw + "Root",
    new XAttribute("xmlns", "http://www.adventure-works.com"),
    new XAttribute(XNamespace.Xmlns + "fc", "www.fourthcoffee.com"),
    new XElement(fc + "Child",
        new XElement(aw + "DifferentChild", "other content")
    ),
    new XElement(aw + "Child2", "c2 content"),
    new XElement(fc + "Child3", "c3 content")
);
Console.WriteLine(root);

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

<Root xmlns="http://www.adventure-works.com" xmlns:fc="www.fourthcoffee.com">
  <fc:Child>
    <DifferentChild>other content</DifferentChild>
  </fc:Child>
  <Child2>c2 content</Child2>
  <fc:Child3>c3 content</fc:Child3>
</Root>

Пример. Создание документа с двумя пространствами имен с префиксами

В этом примере создается документ, который содержит два пространства имен с префиксами.

XNamespace aw = "http://www.adventure-works.com";
XNamespace fc = "www.fourthcoffee.com";
XElement root = new XElement(aw + "Root",
    new XAttribute(XNamespace.Xmlns + "aw", aw.NamespaceName),
    new XAttribute(XNamespace.Xmlns + "fc", fc.NamespaceName),
    new XElement(fc + "Child",
        new XElement(aw + "DifferentChild", "other content")
    ),
    new XElement(aw + "Child2", "c2 content"),
    new XElement(fc + "Child3", "c3 content")
);
Console.WriteLine(root);

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

<aw:Root xmlns:aw="http://www.adventure-works.com" xmlns:fc="www.fourthcoffee.com">
  <fc:Child>
    <aw:DifferentChild>other content</aw:DifferentChild>
  </fc:Child>
  <aw:Child2>c2 content</aw:Child2>
  <fc:Child3>c3 content</fc:Child3>
</aw:Root>

Пример. Создание пространства имен с помощью развернутых имен

Другой метод получения того же результата состоит в использовании развернутых имен вместо объявления и создания объекта XNamespace.

Этот подход влияет на производительность. Каждый раз при передаче строки, содержащей развернутое имя в LINQ to XML, LINQ to XML должен проанализировать имя, найти атомизованное пространство имен и найти атомизованное имя. Этот процесс требует затрат процессорного времени. Если производительность является важным фактором, целесообразнее объявить и использовать объект XNamespace явным образом.

Если производительность является важной проблемой, дополнительные сведения см. в разделе "Предварительная атомизация объектов XName".

// Create an XML tree in a namespace, with a specified prefix
XElement root = new XElement("{http://www.adventure-works.com}Root",
    new XAttribute(XNamespace.Xmlns + "aw", "http://www.adventure-works.com"),
    new XElement("{http://www.adventure-works.com}Child", "child content")
);
Console.WriteLine(root);

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

<aw:Root xmlns:aw="http://www.adventure-works.com">
  <aw:Child>child content</aw:Child>
</aw:Root>

См. также