Класс System.Xml.XmlTextWriter

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

Класс XmlTextWriter реализует XmlWriter класс.

Примечание.

Рекомендуется создавать XmlWriter экземпляры с помощью XmlWriter.Create метода и XmlWriterSettings класса, чтобы воспользоваться преимуществами новых функций.

XmlTextWriter поддерживает стек пространства имен, соответствующий всем пространствам имен, определенным в текущем стеке элементов. С помощью XmlTextWriter можно вручную объявить пространства имен.

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

Приведенный выше код C# создает следующие выходные данные. XmlTextWriter способствует объявлению пространства имен корневому элементу, чтобы избежать дублирования двух дочерних элементов. Дочерние элементы выбирают префикс из объявления пространства имен.

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

XmlTextWriter также позволяет переопределить текущее объявление пространства имен. В следующем примере URI пространства имен "123" переопределяется параметром abc для создания XML-элемента <x:node xmlns:x="abc"/>.

w.WriteStartElement("x","node","123");
w.WriteAttributeString("xmlns","x",null,"abc");

Используя методы записи, которые принимают префикс в качестве аргумента, можно также указать, какой префикс следует использовать. В следующем примере два разных префикса сопоставляются с одинаковым универсальным кодом ресурса (URI) пространства имен для создания XML-текста <x:root xmlns:x="urn:1"><y:item xmlns:y="urn:1"/></x:root>.

XmlTextWriter w = new XmlTextWriter(Console.Out);
w.WriteStartElement("x","root","urn:1");
w.WriteStartElement("y","item","urn:1");
w.WriteEndElement();
w.WriteEndElement();
w.Close();

Если существует несколько объявлений пространства имен, сопоставляемых различными префиксами с одним и тем же универсальным кодом ресурса (URI) пространства имен, XmlTextWriter путь к стеку объявлений пространства имен возвращается назад и выбирает ближайшее.

XmlTextWriter w = new XmlTextWriter(Console.Out);
w.Formatting = Formatting.Indented;
w.WriteStartElement("x","root","urn:1");
w.WriteStartElement("y","item","urn:1");
w.WriteAttributeString("attr","urn:1","123");
w.WriteEndElement();
w.WriteEndElement();
w.Close();

В приведенном выше примере C#, так как WriteAttributeString вызов не указывает префикс, средство записи использует последний префикс, отправленный в стек пространства имен, и создает следующий XML-код:

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

Если возникают конфликты пространства имен, их разрешается путем XmlTextWriter создания альтернативных префиксов. Например, если атрибут и элемент имеют один и тот же префикс, но разные пространства имен, XmlWriter создается альтернативный префикс для атрибута. Созданные префиксы называются n{i}i числом, начиная с 1. Число сбрасывается до 1 для каждого элемента.

Атрибуты, связанные с URI пространства имен, должны иметь префикс (пространства имен по умолчанию не применяются к атрибутам). Это соответствует разделу 5.2 пространства имен W3C в рекомендации XML. Если атрибут ссылается на универсальный код ресурса (URI) пространства имен, но не указывает префикс, модуль записи создает префикс для атрибута.

При написании пустого элемента добавляется дополнительное пространство между именем тега и закрывающим тегом, например <item />. Это обеспечивает совместимость со старыми браузерами.

Если параметр String метода используется в качестве параметра метода и nullString.Empty эквивалентен. String.Empty следует правилам W3C.

Чтобы записать строго типизированные данные, используйте XmlConvert класс для преобразования типов данных в строку. Например, следующий код C# преобразует данные из DoubleString и записывает элемент <price>19.95</price>.

Double price = 19.95;
writer.WriteElementString("price", XmlConvert.ToString(price));

XmlTextWriterне проверка для следующего:

  • Недопустимые символы в именах атрибутов и элементов.
  • Символы Юникода, которые не соответствуют заданной кодировке. Если символы Юникода не соответствуют заданной кодировке, XmlTextWriter он не экранирует символы Юникода в сущности символов.
  • Повторяющиеся атрибуты.
  • Символы в общедоступном идентификаторе DOCTYPE или системном идентификаторе.

Вопросы безопасности

Следующие элементы следует учитывать при работе с классом XmlTextWriter .

  • Исключения, вызванные сведениями XmlTextWriter о пути, которые не нужны для приложения. Приложения должны перехватывать исключения и обрабатывать их соответствующим образом.

  • При передаче XmlTextWriter другому приложению ему предоставляется базовый поток. Если нужно передать XmlTextWriter приложению с частичным доверием, то следует использовать объект XmlWriter, созданный методом Create.

  • Данные XmlTextWriter , передаваемые WriteDocType в методы или WriteRaw методы, не проверяются. Не следует передавать произвольные данные этим методам.

  • Если параметры по умолчанию изменены, нет гарантии того, что созданные выходные данные являются хорошо сформированными XML-данными.

  • Не принимать вспомогательные компоненты, такие как Encoding объект, из ненадежного источника.