2016-11-28 6 views
0

Я хочу знать причину, лежащую в основе XmlWriter.WriteStartDocument() и XmlWriter.WriteEndDocument().Можно ли использовать XmlWriter.WriteEndDocument() без вызова XmlWriter.WriteStartDocument()

В моем сценарии я создаю документ XML с некоторыми данными в нем, например:

XmlWriter xmlWriter = XmlWriter.Create(file); 

xmlWriter.WriteStartDocument(); 

// write xml elements and attributes... 

xmlWriter.WriteEndDocument(); 

xmlWriter.Flush(); 

Хотя сериализации, XmlWriter не бросает любое исключение, если пропустить вызов xmlWriter.WriteStartDocument() и просто позвонить xmlWriter.WriteEndDocument() на конец.

Ниже фрагмент кода не бросает какую-либо ошибку или исключение:

XmlWriter xmlWriter = XmlWriter.Create(file); 

// write xml elements and attributes... 

xmlWriter.WriteEndDocument(); 

xmlWriter.Flush(); 

Как это возможно? И можете ли вы объяснить функциональность WriteStartDocument() и WriteEndDocument()?

+0

@stuartd Но в C# он отлично работает с WriteEndDocument(). –

+0

@stuartd Мои вопросы: «Почему оба оператора не нужны для записи объявления xml в файл?». Просто «WriteEndDocument()» достаточно, чтобы написать объявление xml. Кажется странным. –

+0

@stuartd в XML 1.0 (что наиболее часто используется, 1.1 очень редко), [объявление необязательно] (http://stackoverflow.com/questions/7007427/does-a-valid-xml-file-require -an-XML-декларация). –

ответ

2

Per the documentation для WriteStartDocument, этот метод записывает декларацию XML, который появляется перед корневым элементом ::

При переопределении в производном классе записывает объявление XML.

И в the documentation для WriteEndDocument:

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

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

В отличие от других аналогичных методов, таких как WriteStartElement и WriteEndElement, вызов одного из них без другого не может привести вас к состоянию, в котором документ недействителен. Тем не менее, я бы все же советовал вам позвонить им в начале и в конце написания документа, поскольку это, очевидно, то, что API намеревается вам сделать.

Как в стороне, редко нужно использовать XmlReader и XmlWriter прямо так. Они очень низкоуровневые XML API. Я бы предложил вам изучить LINQ для XML и XmlSerializer для большинства случаев использования.

+0

Спасибо за ваш ответ. Это полезно. –

 Смежные вопросы

  • Нет связанных вопросов^_^