Как создать использование XmlDocument XmlWriter в.NET?

Ну, это не об отображении stacktrace или тихо катастрофическом отказе. Это о способности передать ошибки между слоями.

проблема с контролируемыми исключительными ситуациями, они поощряют людей глотать важные детали (а именно, класс исключений). Если Вы принимаете решение не глотать ту деталь, то необходимо продолжать добавлять объявления вызовов через целое приложение. Это означает 1) это, новый тип исключительной ситуации будет влиять на большое количество функциональных подписей и 2) Вас, может пропустить определенный экземпляр исключения, которое Вы на самом деле - хотите поймать (скажите открытие вторичного файла для функции, которая пишет данные в файл. Вторичный файл является дополнительным, таким образом, можно проигнорировать его ошибки, но потому что подпись throws IOException, легко пропустить это).

я на самом деле справляюсь с этой ситуацией теперь в приложении. Мы повторно упаковали почти исключения как AppSpecificException. Это заставило подписи действительно убрать, и мы не должны были волноваться о взрыве throws в подписях.

, Конечно, теперь мы должны специализировать обработку ошибок в более высоких уровнях, реализовав логику повторной попытки и такой. Все - AppSpecificException, тем не менее, таким образом, мы не можем сказать, "Если IOException брошен, повторите" или, "Если ClassNotFound брошен, прервитесь полностью". У нас нет надежного способа стать к настоящими исключение, потому что вещи повторно упаковываются снова и снова, поскольку они передают между нашим кодом и сторонним кодом.

Поэтому я - большой поклонник обработки исключений в Python. Можно поймать только вещи, которые Вы хотите и/или можете обработать. Все остальное пузырится, как будто Вы повторно бросили его сами (который Вы сделали так или иначе).

я нашел, снова и снова, и в течение проекта я упомянул, та обработка исключений попадает в 3 категории:

  1. Выгода и дескриптор конкретный исключение. Это должно реализовать логику повторной попытки, например.
  2. Выгода и перебросок другой исключения. Все, что происходит здесь, обычно регистрируется, и обычно банальное сообщение как "Неспособный открыть $filename". Это ошибки, о которых Вы ничего не можете сделать; только более высокий уровень знает достаточно для обработки его.
  3. Выгода все и дисплей сообщение об ошибке. Это обычно в самом корне диспетчера и всего, что он делает он удостоверяется, что может передать ошибку вызывающей стороне с помощью механизма неисключения (раскрывающийся диалог, упорядочив Ошибочный объект RPC, и т.д.).
47
задан Boaz 28 August 2009 в 13:45
поделиться

4 ответа

Вот по крайней мере одно решение:

XmlDocument doc = new XmlDocument(); 
using (XmlWriter writer = doc.CreateNavigator().AppendChild()) 
{ 
    // Do this directly 
     writer.WriteStartDocument(); 
     writer.WriteStartElement("root"); 
     writer.WriteElementString("foo", "bar"); 
     writer.WriteEndElement(); 
     writer.WriteEndDocument();
    // or anything else you want to with writer, like calling functions etc.
}

Очевидно, XpathNavigator дает вам XmlWriter, когда вы вызываете AppendChild ()

Кредиты переходят к Мартину Хоннену в: http: // groups. google.com/group/microsoft.public.dotnet.xml/browse_thread/thread/24e4c8d249ad8299?pli=1[1259 visible

82
ответ дан 26 November 2019 в 19:32
поделиться

You could do the opposite : build the XmlDocument first using DOM, then write it to a XmlWriter :

XmlDocument xdoc = new XmlDocument();
... // build the document

StringWriter S = new StringWriter();
XmlWriter xw = XmlWriter.Create(S);
xdoc.WriteTo(xw);
9
ответ дан 26 November 2019 в 19:32
поделиться

Идея XmlWriter состоит в том, чтобы дождаться завершения изменения данных перед началом записи.

XmlWriter не создавался с учетом вашей ситуации.

Либо

  • Подождите, пока вы не узнаете, что это за данные будет до записи

или

  • Делайте то, что вы делаете в настоящее время
4
ответ дан 26 November 2019 в 19:32
поделиться

Существует базовый объект Stream, в который XmlWriter писал, если он был двунаправленным ( MemoryStream), вы можете просто переместить его обратно на -0-, а затем использовать объект Stream в XmlDocument.Load (потоке).

HTH,

Z

1
ответ дан 26 November 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: