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


Практическое руководство. Управление префиксами пространств имен (LINQ to XML)

В этой статье описывается, как управлять префиксами пространства имен при сериализации XML-дерева в C# и Visual Basic.

Во многих ситуациях не требуется управлять префиксами пространства имен. Однако для некоторых средств программирования XML требуется. Например, вы можете управлять таблицей стилей XSLT или документом XAML, содержащим внедренные выражения XPath, ссылающиеся на определенные префиксы пространства имен. В таком случае важно сериализовать документ с этими префиксами. Это распространенная причина для управления префиксами пространства имен.

Другая причина заключается в том, что вы хотите, чтобы пользователи вручную изменяли XML-документ, и вы хотите создать префиксы пространства имен, удобные для ввода пользователем. Пусть создается документ XSD. В соответствии с соглашениями по схемам при этом в качестве префиксов пространства имен схемы используются xs или xsd.

Для управления префиксами пространства имен нужно вставлять атрибуты, объявляющие пространства имен. При объявлении пространств имен с определенными префиксами LINQ to XML попытается учитывать префиксы пространства имен при сериализации.

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

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

В этом примере объявляются два пространства имен. Он задает префикс пространства http://www.adventure-works.com имен и префикс awfc для www.fourthcoffee.com пространства имен.

XNamespace aw = "http://www.adventure-works.com";
XNamespace fc = "www.fourthcoffee.com";
XElement root = new XElement(aw + "Root",
    new XAttribute(XNamespace.Xmlns + "aw", "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);
Imports <xmlns:aw="http://www.adventure-works.com">
Imports <xmlns:fc="www.fourthcoffee.com">

Module Module1

    Sub Main()
        Dim root As XElement = _
            <aw:Root>
                <fc:Child>
                    <aw:DifferentChild>other content</aw:DifferentChild>
                </fc:Child>
                <aw:Child2>c2 content</aw:Child2>
                <fc:Child3>c3 content</fc:Child3>
            </aw:Root>
        Console.WriteLine(root)
    End Sub

This example produces the following output:

```xml
<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>

См. также