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


Префиксы пространств имен атрибутов в XmlTextWriter

Существует несколько способов обработки префиксов пространства имен для атрибута с помощью XmlTextWriter: WriteAttributes, WriteAttributeString и WriteStartAttribute.

WriteAttributes

Если текущая позиция расположена в узле элемента, метод WriteAttributes записывает все атрибуты, найденные на текущей позиции в класс XmlReader. Если текущая позиция указывает на атрибут, возвращается этот атрибут и все оставшиеся в элементе атрибуты. Если позиция указывает на тип узла (NodeType) со значением XmlDeclaration, записываются все атрибуты декларации. Все другие типы узлов не изменяются. Если для класса XmlReader декларирован префикс пространства имен, метод WriteAttributes записывает в дополнение к атрибутам префикс пространства имен. В следующем примере кода показано, как метод WriteAttributes записывает префикс пространства имен с атрибутом.

Dim r As XmlTextReader = CreateTextReaderStr("<ROOT xmlns:p='n' p:a='abc'/>")
r.Read()
r.MoveToAttribute("p:a")

Dim tw As New XmlTextWriter(Console.Out)
tw.WriteStartElement("ROOT")
tw.WriteAttributes(r, False)
tw.WriteEndElement()
XmlTextReader r = CreateTextReaderStr("<ROOT xmlns:p='n' p:a='abc'/>");
r.Read();
r.MoveToAttribute("p:a");

XmlTextWriter tw = new XmlTextWriter(Console.Out);
tw.WriteStartElement("ROOT");
tw.WriteAttributes(r, false);
tw.WriteEndElement();

Выходные данные

<ROOT p:a="abc" xmlns:p="n" />

WriteAttributeString

Другой способ обработки префиксов в пространстве имен состоит в использовании в приложении одного из методов WriteAttributeString, который принимает пространство имен как префикс. Один из методов WriteAttributeString принимает в качестве аргументов имя атрибута, значение атрибута и пространство имен, записывает атрибут с указанным значением и связывает его с пространством имен.

Другой метод WriteAttributeString использует определяемый пользователем префикс пространства имен и во время записи атрибута связывает атрибут с данным префиксом. Образец кода, показывающий использование метода WriteAttributeString и использование определяемого пользователем префикса пространства имен, см. в разделе WriteAttributeString.

WriteStartAttribute

Метод WriteStartAttribute создает начало атрибута и дополнительно принимает префикс пространства имен или URI-код пространства имен в качестве параметра в зависимости от используемого метода.

Следующий пример кода принимает строку в качестве первого входного аргумента, которая представляет собой префикс пространства имен bk, найденный с помощью вызова метода LookupPrefix. После задания префикса, локального имени и пространства имен с помощью метода WriteStartAttribute метод WriteString присваивает атрибуту значение.

' Write an element (this one is the root).
writer.WriteStartElement("bookstore")
' Write the namespace declaration.
writer.WriteAttributeString("xmlns", "bk", Nothing, "urn:samples")
writer.WriteStartElement("book")
' Look up the prefix, and then write the ISBN attribute.
Dim prefix As String = writer.LookupPrefix("urn:samples")
writer.WriteStartAttribute(prefix, "ISBN", "urn:samples")
writer.WriteString("1-861003-78")
writer.WriteEndAttribute()
' Write the style element.
writer.WriteStartElement(prefix, "style", "urn:samples")
writer.WriteString("hardcover")
writer.WriteEndElement()
' Write the end tag for the book element.
writer.WriteEndElement()
'Write the close tag for the root element.
writer.WriteEndElement()
                
// Write an element (this one is the root).
writer.WriteStartElement("bookstore");   
// Write the namespace declaration.
writer.WriteAttributeString("xmlns", "bk", null, "urn:samples");
writer.WriteStartElement("book");
// Look up the prefix, and then write the ISBN attribute.
string prefix = writer.LookupPrefix("urn:samples");
writer.WriteStartAttribute(prefix, "ISBN", "urn:samples");
writer.WriteString("1-861003-78");
writer.WriteEndAttribute();
// Write the style element.
writer.WriteStartElement(prefix, "style", "urn:samples");
writer.WriteString("hardcover");
writer.WriteEndElement();
// Write the end tag for the book element.
writer.WriteEndElement();
// Write the close tag for the root element.
writer.WriteEndElement();

Выходные данные

<bookstore xmlns:bk="urn:samples">
  <book bk:ISBN="1-861003-78">
      <bk:style>hardcover</bk:style>
  </book>
</bookstore>

В соответствии с разделом Namespace Defaulting (выбор пространства имен по умолчанию) рекомендации Namespaces in XML консорциума W3C, если атрибуты имеют связанные URI-коды пространств имен, то атрибут должен также иметь префикс. В следующем примере кода показано, что префикс должен быть включен во время записи атрибута с помощью метода WriteAttributes.

Dim w As New XmlTextWriter(Console.Out)
w.WriteStartElement("root")
w.WriteAttributeString("order", "urn:1", "123")
w.WriteEndElement()
w.Close()
XmlTextWriter w = new XmlTextWriter(Console.Out);
w.WriteStartElement("root");
w.WriteAttributeString("order","urn:1", "123");
w.WriteEndElement();
w.Close();

Выходные данные

<root n1:order="123" xmlns:n1="urn:1"/>

Такие выходные данные получаются, даже если элемент root связан с пространством имен по умолчанию urn:1. Префиксы именуются n{i}, где i начинается с 1. Индексация начинается с 1 для каждого следующего элемента. Поэтому, если вложенному дочернему элементу требуется сформированный префикс, он использует n1.

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

Dim w As New XmlTextWriter(Console.Out)
w.WriteStartElement("root")
w.WriteAttributeString("order", "urn:1", "123")
w.WriteAttributeString("book", "urn:2", "The Great Escape")
w.WriteEndElement()
w.Close()
XmlTextWriter w = new XmlTextWriter(Console.Out);
w.WriteStartElement("root");
w.WriteAttributeString("order","urn:1", "123");
w.WriteAttributeString("book","urn:2", "The Great Escape");
w.WriteEndElement();
w.Close();

Выходные данные

<root n1:order="123" n2:book="The Great Escape" xmlns:n1="urn:1" xmlns:n2="urn:2"/>

См. также

Ссылки

XmlTextWriter

XmlTextWriter

XmlWriter

XmlWriter