Как создать документ с пространствами имен (C#) (LINQ to XML)
В этом разделе описано, как создавать документы с пространствами имен.
Пример
Чтобы создать элемент или атрибут, находящийся в пространстве имен, необходимо сначала объявить и инициализировать объект XNamespace. Затем следует использовать перегруженный оператор сложения для объединения пространства имен с локальным именем, выраженным строкой.
В следующем примере создается документ с одним пространством имен. По умолчанию LINQ to XML сериализует документ с использованием пространства имен по умолчанию.
// Create an XML tree in a namespace.
XNamespace aw = "https://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
new XElement(aw + "Child", "child content")
);
Console.WriteLine(root);
В этом примере выводятся следующие данные:
<Root xmlns="https://www.adventure-works.com">
<Child>child content</Child>
</Root>
В следующем примере создается документ с одним пространством имен. Он также создает атрибут, который объявляет пространство имен с префиксом пространства имен. Создать атрибут, объявляющий пространство имен с префиксом, можно, указав имя атрибута в качестве префикса пространства имен и поместив его в пространство имен Xmlns. Значение этого атрибута представляет собой URI пространства имен.
// Create an XML tree in a namespace, with a specified prefix
XNamespace aw = "https://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
new XAttribute(XNamespace.Xmlns + "aw", "https://www.adventure-works.com"),
new XElement(aw + "Child", "child content")
);
Console.WriteLine(root);
В этом примере выводятся следующие данные:
<aw:Root xmlns:aw="https://www.adventure-works.com">
<aw:Child>child content</aw:Child>
</aw:Root>
Следующий пример иллюстрирует создание документа, содержащего два пространства имен. Одно из них - пространство имен по умолчанию. Другое - пространство имен с префиксом.
При включении атрибутов пространств имен в корневой элемент пространства имен сериализуются, так что https://www.adventure-works.com становится пространством имен по умолчанию, а www.fourthcoffee.com сериализуется с префиксом «fc». Чтобы создать атрибут, объявляющий применяемое по умолчанию пространство имен, необходимо создать атрибут с именем «xmlns» без пространства имен. Значение этого атрибута является используемым по умолчанию идентификатором URI пространства имен.
// The https://www.adventure-works.com namespace is forced to be the default namespace.
XNamespace aw = "https://www.adventure-works.com";
XNamespace fc = "www.fourthcoffee.com";
XElement root = new XElement(aw + "Root",
new XAttribute("xmlns", "https://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="https://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 = "https://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="https://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 строки, содержащей развернутое имя, система должна проанализировать это имя, обнаружить атомизированное пространство имен и атомарное имя. Этот процесс требует затрат процессорного времени. Если производительность является важным фактором, целесообразнее объявить и использовать объект XNamespace явным образом.
Дополнительные сведения, касающиеся повышения производительности, см. в разделе Предварительная атомизация объектов XName (LINQ to XML).
// Create an XML tree in a namespace, with a specified prefix
XElement root = new XElement("{https://www.adventure-works.com}Root",
new XAttribute(XNamespace.Xmlns + "aw", "https://www.adventure-works.com"),
new XElement("{https://www.adventure-works.com}Child", "child content")
);
Console.WriteLine(root);
В этом примере выводятся следующие данные:
<aw:Root xmlns:aw="https://www.adventure-works.com">
<aw:Child>child content</aw:Child>
</aw:Root>