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


Класс 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-литералы, которые не включают использование развернутых имен.