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


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

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

Xml-имена включают пространство имен и локальное имя. Полное имя — это сочетание пространства имен и локального имени.

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

XName не содержит открытых конструкторов. Вместо этого этот класс предоставляет неявное преобразование, String которое позволяет создавать XNameобъект. Чаще всего это преобразование используется при создании элемента или атрибута: первый аргумент XElement конструктора — это .XName Передав строку, вы используете неявное преобразование. Следующий код создает элемент с именем, которое не находится в пространстве имен:

XElement root = new XElement("ElementName", "content");
Console.WriteLine(root);

В Visual Basic лучше использовать XML-литералы:

Dim root As XElement = <ElementName>content</ElementName>
Console.WriteLine(root)

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

<ElementName>content</ElementName>

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

Пример Visual Basic создает XElement xml-литералы. Несмотря на то, что используются XML-литералы, XName для объекта создается XElementобъект.

Кроме того, можно вызвать Get метод для XName объекта. Однако рекомендуется использовать неявное преобразование из строки.

Создание XName в пространстве имен

Как и в XML, XName может находиться в пространстве имен или не может находиться в пространстве имен.

Для C# рекомендуемый подход к созданию XName в пространстве имен — объявить XNamespace объект, а затем использовать переопределение оператора добавления.

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

XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "ElementName", "content");
Console.WriteLine(root);
Imports <xmlns="http://www.adventure-works.com">

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

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

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

Создание XName без пространства имен

Свойство NamespaceXName объекта гарантированно не имеет значения NULL. Если пространство XName имен отсутствует, Namespace то для свойства будет задано Noneзначение . В следующем коде показано следующее:

XElement root = new XElement("ElementName", "content");
if (root.Name.Namespace == XNamespace.None)
    Console.WriteLine("The element is in no namespace.");
else
    Console.WriteLine("The element is in a namespace.");
Dim root As XElement = <ElementName>content</ElementName>
If (root.Name.Namespace Is XNamespace.None) Then
    Console.WriteLine("The element is in no namespace.")
Else
    Console.WriteLine("The element is in a namespace.")
End If

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

The element is in no namespace.

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

Вы также можете создать XName из развернутого XML-имени в форме {namespace}localname:

XElement root = new XElement("{http://www.adventure-works.com}ElementName", "content");
Console.WriteLine(root);
Dim root As XElement = New XElement("{http://www.adventure-works.com}ElementName", "content")
Console.WriteLine(root)

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

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

Помните, что создание с помощью развернутого имени менее эффективно, чем создание XNameXNamespace объекта и использование переопределения оператора добавления. Это также менее эффективно, чем импорт глобального пространства имен и использование XML-литералы в Visual Basic.

Если вы создаете XName развернутое имя, LINQ to XML должен найти атомизованный экземпляр пространства имен. Эта работа должна повторяться для каждого использования развернутого имени. Это дополнительное время, вероятно, будет незначительным при написании запросов LINQ; однако при создании большого XML-дерева может оказаться значительным.

Объекты XName атомизированы

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

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