2013-04-04 4 views
7

Я пишу xml с XmlWriter. Мой код имеет много разделов, как это:Как проверить имя элемента с помощью WriteEndElement

xml.WriteStartElement("payload"); 
ThirdPartyLibrary.Serialise(results, xml); 
xml.WriteEndElement(); // </payload> 

Проблема заключается в том, что метод ThirdPartyLibrary.Serialise является ненадежным. Это может произойти (в зависимости от переменной results), что он не закрывает все теги, которые он открывает. Как следствие, моя строка WriteEndElement извращается, потребляет закрытие вешающих тегов библиотеки, вместо того, чтобы писать </payload>.

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

xml.WriteEndElement("payload"); 

Вы можете думать об этом, как XmlReader.ReadStartElement(name), который бросает, если курсор не находится в ожидаемом месте в документе.

Как я могу это достичь?


Редактировать: Второй вариант использования этого метода расширения - сделать мой собственный код более читабельным и надежным.

+0

Можете ли вы отправить новый 'XmlWriter' в' ThirdPartyLibrary.Serialise' и проверить его экспликацию, прежде чем добавлять его в свой объект 'xml'? – zimdanen

+0

Можете ли вы как-то проверить «результаты» перед тем, как передать его в «Сериализация»? (т. е. вы можете воспроизвести разрыв метода сериализации при передаче определенных типов результатов) – keyboardP

+0

@KeyboardP - сторонняя библиотека на самом деле является поставляемым пользователем плагином, реализующим интерфейс, поэтому ему не следует доверять. –

ответ

0

В конце концов, я написал метод Удлинитель WriteSubtree, который дает этот полезный API:

using (var resultsXml = xml.WriteSubtree("Results")) 
{ 
    ThirdPartyLibrary.Serialise(results, resultsXml); 
} 

Метод расширения XmlWriter.WriteSubtree является аналогом .NET-х XmlReader.ReadSubtree. Он возвращает специальный XmlWriter, который проверяет смешные дела. Его метод dispose закрывает любые теги, оставленные открытыми.

1

XMLWriter просто записывает данные xml в поток без какой-либо проверки. Если он выполняет какую-либо проверку при написании тегов xml, проблема с производительностью возникает при создании большого XML-файла.

Создание XML-файла с использованием XMLWriter зависит от риска разработчика. Если вы хотите сделать такую ​​проверку, вы можете использовать XMLDocument.

Если вы действительно хотите выполнить эту проверку в XMLWriter, вам нужно создать запись с помощью String или StringBuilder. Поскольку, если вы используете Stream или TextWriter, вы не можете прочитать информацию, которая записывается в поток в середине письма. В каждом обновлении XML вы должны прочитать строку и написать свой собственный метод для проверки письменной информации.

Предлагаю вам использовать XMLDocument для создания этих типов xml.

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