Класс System.Xml.Linq.XNamespace

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

Этот класс представляет xml-конструкцию пространств имен.

Каждый XName содержит объект XNamespace. Даже если элемент не является пространством имен, имя элемента XName все же содержит пространство имен, XNamespace.None. Гарантируется, что свойство XName.Namespace не имеет значения null.

Создание объекта XNamespace

Наиболее распространенным способом создания XNamespace объекта является просто назначить строку. Затем можно объединить пространство имен с локальным именем с помощью переопределения оператора добавления. В следующем примере показана идиома:

XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root", "Content");
Console.WriteLine(root);
Dim aw As XNamespace = "http://www.adventure-works.com"
Dim root As XElement = New XElement(aw + "Root", "Content")
Console.WriteLine(root)

Однако в Visual Basic обычно объявляется глобальное пространство имен по умолчанию, как показано ниже.

Imports <xmlns='http://www.adventure-works.com'>

Module Module1
    Sub Main()
        Dim root As XElement = _
            <Root>Content</Root>
        Console.WriteLine(root)
    End Sub
End Module

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

<Root xmlns="http://www.adventure-works.com">Content</Root>

Назначение строки для неявного XNamespace преобразования.String

Дополнительные сведения и примеры см. в статье о создании документа с пространствами имен в C# (LINQ to XML ).

Дополнительные сведения об использовании пространств имен в Visual Basic см. в статье "Работа с пространствами имен XML".

Префиксы пространства имен управления

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

XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
    new XAttribute(XNamespace.Xmlns + "aw", "http://www.adventure-works.com"),
    "Content");
Console.WriteLine(root);
Dim aw As XNamespace = "http://www.adventure-works.com"
Dim root As XElement = New XElement(aw + "Root", _
    New XAttribute(XNamespace.Xmlns + "aw", "http://www.adventure-works.com"), _
    "Content")
Console.WriteLine(root)

В Visual Basic вместо создания узла пространства имен для управления префиксами пространства имен обычно используется объявление глобального пространства имен:

Imports <xmlns:aw='http://www.adventure-works.com'>

Module Module1
    Sub Main()
        Dim root As XElement = _
            <aw:Root>Content</aw:Root>
        Console.WriteLine(root)
    End Sub
End Module

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

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

Дополнительные сведения см. в разделе "Управление префиксами пространства имен".

Создание пространства имен по умолчанию

При создании атрибута, который будет пространством имен, если имя атрибута имеет специальное значение xmlns, то при сериализации xml-дерева пространство имен будет объявлено как пространство имен по умолчанию. Специальный атрибут с именем "xmlns" сам не находится в любом пространстве имен. Значение атрибута — URI пространства имен.

В следующем примере создается xml-дерево, содержащее атрибут, объявленный таким образом, чтобы пространство имен стало пространством имен по умолчанию:

XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
    new XAttribute("xmlns", "http://www.adventure-works.com"),
    new XElement(aw + "Child", "content")
);
Console.WriteLine(root);
Dim aw As XNamespace = "http://www.adventure-works.com"
Dim root As XElement = New XElement(aw + "Root", _
    New XAttribute("xmlns", "http://www.adventure-works.com"), _
    New XElement(aw + "Child", "content") _
)
Console.WriteLine(root)

В Visual Basic вместо создания узла пространства имен для создания пространства имен по умолчанию обычно используется глобальное объявление пространства имен по умолчанию:

Imports <xmlns='http://www.adventure-works.com'>

Module Module1
    Sub Main()
        Dim root As XElement = _
            <Root>
                <Child>content</Child>
            </Root>
        Console.WriteLine(root)
    End Sub
End Module

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

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

Атомизация XNamespace

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

Использование развернутых имен

Другой способ указать пространство имен и локальное имя — использовать развернутое имя в форме {namespace}name:

XElement e = new XElement("{http://www.adventure-works.com}Root",
     new XAttribute("{http://www.adventure-works.com}Att", "content")
);
Console.WriteLine(e);
Dim e As XElement = New XElement("{http://www.adventure-works.com}Root", _
     New XAttribute("{http://www.adventure-works.com}Att", "content") _
)
Console.WriteLine(e)

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

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

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

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