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


Обработка пространств имен в XmlWriter

Пространства имен используются, чтобы указывать имена элементов и атрибутов в XML-документе. Префиксы пространства имен связывают элементы и атрибуты с пространствами имен, которые в свою очередь связаны с URI-ссылкой. Пространства имен обеспечивают уникальность имен элементов и атрибутов в XML-документе.

Класс XmlWriter хранит стек пространств имен, который соответствует всем пространствам имен, определенным в текущей области. При написании элементов и атрибутов можно использовать следующие способы.

  • Пространства имен объявляются вручную.

  • Текущее объявление пространства имен обходится новым пространством имен.

  • Префикс пространства имен указывается при написании атрибутов или элементов.

Объявление пространства имен вручную

Декларации пространств имен можно создать вручную, воспользовавшись методом WriteAttributeString. Это бывает полезным, если известно, как наилучшим образом оптимизировать количество деклараций пространств имен. В следующем коде декларация пространства имен создается в корневом элементе.

writer.WriteStartElement("root")
writer.WriteAttributeString("xmlns", "x", Nothing, "urn:1")
writer.WriteStartElement("item", "urn:1")
writer.WriteEndElement()
writer.WriteStartElement("item", "urn:1")
writer.WriteEndElement()
writer.WriteEndElement()
writer.WriteStartElement("root");
writer.WriteAttributeString("xmlns", "x", null, "urn:1");
writer.WriteStartElement("item", "urn:1");
writer.WriteEndElement();
writer.WriteStartElement("item", "urn:1");
writer.WriteEndElement();
writer.WriteEndElement();

Код формирует следующую XML-строку.

<root xmlns:x="urn:1">
  <x:item/>
  <x:item/>
</root>

Поскольку декларация пространства имен находится в элементе root, она не повторяется в двух дочерних элементах. Элементы item также получают префикс из декларации пространства имен.

Переопределение текущих пространств имен

Пространство имен, связанное с данным префиксом, можно переопределить вручную. В следующем коде URI-код пространства имен для префикса "x" изменяется с "123" на "abc".

writer.WriteStartElement("x", "root", "123")
writer.WriteStartElement("item")
writer.WriteAttributeString("xmlns", "x", Nothing, "abc")
writer.WriteEndElement()
writer.WriteEndElement()
writer.WriteStartElement("x", "root", "123");
writer.WriteStartElement("item");
writer.WriteAttributeString("xmlns", "x", null, "abc");
writer.WriteEndElement();
writer.WriteEndElement();

Код формирует следующую XML-строку:

<x:root xmlns:x="123">
  <item xmlns:x="abc" />
</x:root>

Указание префикса пространства имен

Можно также явно указать префикс при написании элемента или атрибута, чтобы задать используемый префикс пространства имен. Многие методы, используемые для написания элемента и атрибута, позволяют задать префикс пространства имен. В следующем коде показано, как задать префикс при написании элемента.

writer.WriteStartElement("x", "root", "urn:1")
writer.WriteStartElement("y", "item", "urn:1")
writer.WriteEndElement()
writer.WriteEndElement()
writer.WriteStartElement("x", "root", "urn:1");
writer.WriteStartElement("y", "item", "urn:1");
writer.WriteEndElement();
writer.WriteEndElement();

Код формирует следующую XML-строку:

<x:root xmlns:x="urn:1">
  <y:item xmlns:y="urn:1"/>
</x:root>

Класс XmlWriter сохраняет оба префикса, "x" и "y".

ПримечаниеПримечание

Все реализации класса XmlWriter, в том числе XmlTextWriter, разрешают пустое пространство имен в случае, если префикс указан.В этом случае модуль записи не учитывает префикс.Это изменение поведения для Microsoft .NET Framework версии 2.0.В предыдущих версиях подобное условие приводило к формированию исключения XmlException.

См. также

Другие ресурсы

Запись XML с помощью XmlWriter