Создание XML-документа правильного формата с помощью XmlTextWriter
Класс XmlTextWriter, который является производным от класса XmlWriter, записывает XML-данные в файл, консоль, поток, а также может использовать другие типы вывода.При записи XML-данных эти методы выполняют дополнительную работу, чтобы сформировать XML-документы правильного формата.В следующей таблице представлен список методов, которые выполняют работу для обеспечения формирования данных правильного формата.
Метод |
Описание выполняемой работы |
---|---|
WriteAttributeString |
Класс XmlTextWriter экранирует текстовое содержимое атрибута в зависимости от того, что он обнаруживает. |
WriteString |
Класс XmlTextWriter экранирует специальные символы, заменяя их при необходимости на & < > и числовые символьные сущности. |
WriteBase64 |
Класс XmlTextWriter кодирует байты base64, которые затем можно будет прочитать с помощью метода ReadBinary класса XmlReader. |
Следующие дополнительные задачи выполняются классом XmlTextWriter, чтобы обеспечить формирование XML-документов правильного формата.
Гарантирует, что XML-элементы записаны в правильном порядке.Например, он не позволит записать атрибут за пределами элемента, записать блок CDATA внутри элемента или записать несколько корневых элементов.Кроме того, он гарантирует, что декларация <?xml следует первой, а узел <!DOCTYPE стоит перед корневым элементом.
Гарантирует правильность значения и формата атрибута xml:space и обеспечивает допустимость значения этого атрибута в соответствии с рекомендацией W3C XML 1.0 (четвертый выпуск). В следующем примере показано использование допустимого значения для xml:space в методе WriteAttributeString.
w.WriteAttributeString("xml:space", "", "preserve");
Допустимыми значениями для атрибута xml:space являются default и preserve.Если аргумент не является одним из этих значений, возникает исключение ArgumentException.
Проверяет, используется ли строка в качестве параметра (например, Null==String.Empty и String.Empty)), а также соответствует ли она правилам W3C.
В следующей таблице приведены определяемые классом XmlTextWriter дополнительные методы и свойства, которые не унаследованы от класса XmlWriter (и не определены в нем), а также не унаследованы от класса Object.
Метод или свойство |
Описание |
---|---|
XmlTextWriter |
Создает экземпляр класса XmlTextWriter, который принимает имя файла, поток или объект TextWriter.Существует перегруженный метод, принимающий дополнительный параметр, который определяет тип кодирования. |
Указывает, поддерживаются ли пространства имен.Если это свойство имеет значение false, декларации xmlns не пишутся, и можно указывать имена элементов, содержащие любое количество двоеточий. |
|
Определяет, используются ли отступы для форматирования выходных данных. |
|
Определяет, какой символ должен использоваться для создания отступов при формировании отступов с помощью свойства Formatting. |
|
Определяет, сколько символов IndentChars записывать для каждого уровня в иерархии при формировании отступов с помощью свойства Formatting. |
|
Определяет, какой символ используется для заключения значений атрибутов в кавычки.Это должна быть либо одинарная кавычка ', либо двойная кавычка ". |
|
Возвращает строку, в которую записывает класс XmlTextWriter.Возвращает значение NULL, если класс XmlTextWriter был создан с объектом TextWriter, который не является производным от объекта StreamWriter. |
Следующий пример создает выходные XML-данные с помощью класса XmlTextWriter.
Shared Sub WriteQuote(writer As XmlWriter, symbol As String, price As Double, change As Double, volume As Long)
writer.WriteStartElement("Stock")
writer.WriteAttributeString("Symbol", symbol)
writer.WriteElementString("Price", XmlConvert.ToString(price))
writer.WriteElementString("Change", XmlConvert.ToString(change))
writer.WriteElementString("Volume", XmlConvert.ToString(volume))
writer.WriteEndElement()
End Sub 'WriteQuote
Public Shared Sub Main()
Dim writer As New XmlTextWriter(Console.Out)
writer.Formatting = Formatting.Indented
WriteQuote(writer, "MSFT", 74.125, 5.89, 69020000)
writer.Close()
End Sub 'Main
static void WriteQuote(XmlWriter writer, string symbol,
double price, double change, long volume)
{
writer.WriteStartElement("Stock");
writer.WriteAttributeString("Symbol", symbol);
writer.WriteElementString("Price", XmlConvert.ToString(price));
writer.WriteElementString("Change", XmlConvert.ToString(change));
writer.WriteElementString("Volume", XmlConvert.ToString(volume));
writer.WriteEndElement();
}
public static void Main(){
XmlTextWriter writer = new XmlTextWriter(Console.Out);
writer.Formatting = Formatting.Indented;
WriteQuote(writer, "MSFT", 74.125, 5.89, 69020000);
writer.Close();
}
Вывод
<Stock Symbol="MSFT">
<Price>74.125</Price>
<Change>5.89</Change>
<Volume>69020000</Volume>
</Stock>
Выходными данными для метода WriteQuote является символ акции, который метод получает в формате string.Цена и изменение декларируются как тип double, а объем — как тип long.Класс XmlConvert используется, чтобы преобразовать эти переменные в строки.Он имеет методы, которые преобразуют все строгие типы данных в строки.Кроме того, класс XmlConvert имеет методы, выполняющие обратное преобразование путем преобразования строк в типы данных .NET Framework.Дополнительные сведения см. в разделе Кодирование символов в именах XML и преобразование типов XML-данных.
Образец кода, демонстрирующий запись XML-данных в файл, см. в разделе XmlTextWriter.WriteProcessingInstruction.Образец кода, демонстрирующий запись XML-данных в консоль, см. в разделе XmlTextWriter.WriteString.
Следующий код показывает, как записать элемент, который формирует <price>19.95</price>:
'Write the price.writer.WriteElementString("price", "19.95")
//Write the price.writer.WriteElementString("price", "19.95");
Следующий код показывает, как записать атрибут, который формирует <element name="purchaseOrder"/>:
writer.WriteStartElement("element")
writer.WriteAttributeString("name", "purchaseOrder")
writer.WriteEndElement()
writer.WriteStartElement("element");
writer.WriteAttributeString("name", "purchaseOrder");
writer.WriteEndElement();
Запись с помощью метода WriteAttributeString атрибутов и деклараций пространств имен
У метода WriteAttributeString две разные задачи.Одна заключается в записи атрибутов и ассоциировании их с определенными пользователями префиксами пространств имен.Другая задача состоит в формировании деклараций пространств имен.Если при записи атрибутов параметр localname имеет значение xmlns, считается, что этот метод создает декларацию пространства имен.
В следующем примере кода метод WriteAttributeString используется, чтобы записать атрибуты внутри элемента.
'Write the genre attribute.writer.WriteAttributeString("genre", "novel")
'Write the ISBN attribute.writer.WriteAttributeString("ISBN", "1-8630-014")
//Write the genre attribute.writer.WriteAttributeString("genre", "novel");
//Write the ISBN attribute.writer.WriteAttributeString("ISBN", "1-8630-014");
Метод WriteAttributeString также экранирует текстовое содержимое атрибута в зависимости от обнаруженных данных.При использовании двойных кавычек класс XmlTextWriter экранирует их в текстовом содержимом значения атрибута с помощью ".При использовании одинарных кавычек он экранирует текстовое содержимое значения атрибута с помощью '.
Чтобы формировать декларации пространств имен, существует перегруженный метод WriteAttributeString, позволяющий приложению определять декларацию пространства имен.Следующий пример кода создает два пространства имен по умолчанию.Первая декларация привязывает все элементы без префикса к первой декларации пространства имен, а элементы, декларированные с префиксом «po», привязываются ко второй декларации пространства имен.
' Write the default namespace, identified as xmlns with no prefix
writer.WriteAttributeString("xmlns", Nothing, "http://www.w3.org/2000/10/XMLSchema")
' Write a namespace for the purchase order with a prefix of "po"
writer.WriteAttributeString("xmlns", "po", Nothing, "https://contoso.com/po")
// Write the default namespace, identified as xmlns with no prefix
writer.WriteAttributeString("xmlns", null, "http://www.w3.org/2000/10/XMLSchema");
// Write a namespace for the purchase order with a prefix of "po"
writer.WriteAttributeString("xmlns", "po", null, "https://contoso.com/po");
Метод Close
Метод Close проверяет допустимость XML-документа при закрытии потока.Это предотвращает создание недопустимых XML-документов и гарантирует, что XML-документ будет правильного формата.Помимо закрытия потока метод Close также вызывает все необходимые методы WriteEnd<xxx>, чтобы закрыть документ.
Пары методов
В классе XmlWriter также есть пары методов: WriteStartDocument и WriteEndDocument, WriteStartElement и WriteEndElement, а также WriteStartAttribute и WriteEndAttribute.При помощи этих методов можно, например, создать вложенные элементы или атрибуты.Именно с помощью этих пар методов и строится XML-документ. Они позволяют создавать сложные элементы и атрибуты.
Методы WriteStartDocument и WriteEndDocument
Метод WriteStartDocument начинает новый документ и записывает XML-декларацию с атрибутом версии, имеющим значение «1.0», а метод WriteEndDocument закрывает документ.Перед вызовом следующего метода WriteStartDocument для начала записи следующего документа можно изменить форматирование, отступы и другие свойства.Метод WriteStartDocument программно распознает записываемый XML-документ и применяет правила корневого уровня.Если этот метод не используется, создается XML-фрагмент и проверяется, что он правильного формата.Правила корневого уровня не применяются.В следующем примере кода показаны начало и конец документа.
' Write the XML declaration.writer.WriteStartDocument()
...
'Close the document.writer.WriteEndDocument()
// Write the XML declaration.writer.WriteStartDocument();
...// Close the document.writer.WriteEndDocument();
Методы WriteStartElement и WriteEndElement
Пара методов WriteStartElement и WriteEndElement служит разделителем для одного или нескольких элементов.Во всех переопределенных методах WriteStartElement локальное имя для открывающего тега является обязательным параметром.В следующем коде используется пара методов WriteStartElement и WriteEndElement.
' Write the title.writer.WriteStartElement("title")
writer.WriteString("The Handmaid's Tale")
writer.WriteEndElement()
// Write the title.writer.WriteStartElement("title");
writer.WriteString("The Handmaid's Tale");
writer.WriteEndElement();
Вывод
<title>The Handmaid's Tale</title>
Метод WriteStartElement предоставляет переопределенную сигнатуру метода, которая позволяет коду указывать префиксы пространств имен для своих элементов.Дополнительные сведения см. в разделе Префиксы пространств имен элементов в XmlTextWriter.
Методы WriteStartAttribute и WriteEndAttribute
Методы WriteStartAttribute и WriteEndAttribute похожи на другие методы начала и конца, только эти методы начинают и завершают атрибуты.Метод WriteStartAttribute записывает начало атрибута, метод WriteString используется для записи значения атрибута, а метод WriteEndAttribute завершает тег атрибута.В следующем примере кода показана пара методов WriteStartAttribute и WriteEndAttribute.
writer.WriteStartAttribute(prefix, "ISBN", "urn:samples")
writer.WriteString("1-861003-78")
writer.WriteEndAttribute()
writer.WriteStartAttribute(prefix, "ISBN", "urn:samples");
writer.WriteString("1-861003-78");
writer.WriteEndAttribute();
Вывод
<book bk:ISBN="1-861003-78">
Метод WriteStartAttribute имеет перегруженный метод, который позволяет приложению указывать префикс пространства имен с тем, чтобы оно могло ассоциировать этот префикс пространства имен с теми атрибутами, которые оно записывает.Дополнительные сведения см. в разделе Префиксы пространств имен атрибутов в XmlTextWriter.
См. также
Ссылки
Основные понятия
Форматирование выходных XML-данных с помощью XmlTextWriter
Функции пространств имен в XmlTextWriter