эй парни, у меня есть этот сценарий:
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element && reader.Name == itemElementName)
{
XElement item = null;
try
{
item = XElement.ReadFrom(reader) as XElement;
}
catch (XmlException ex)
{
//log line number and stuff from XmlException class
}
}
}
В вышеупомянутом цикле я преобразовываю определенный узел (itemElementName) в XElement.
Некоторые узлы будут хорошим XML и войдут в XElement, однако, некоторые не будут.
В ВЫГОДЕ я хотел бы к не, только ловят стандартный материал XmlException... Я также хотел бы поймать извлечение текущего Xml и строки.
Однако, если я делаю какой-либо вид Операции чтения на узле, прежде чем я передам его XElement, это перемещает читателя вперед.
Как может получить "снимок" содержания OuterXml читателя, не вмешиваясь в, он - положение?
На самом деле ReadSubtree вернет читателя, который "обернет" оригинального читателя. Так что чтение через новый читатель в конечном итоге продвинет и исходный. Вы должны рассматривать XmlReader как читателя только вперед, он просто не может вернуться назад. Что касается вашего сценария, то вместо того, чтобы пытаться запомнить часть XML, вы можете спросить читателя о позиции во входном файле. Просто перейдите к интерфейсу IXmlLineInfo, у него есть методы для возврата строки и позиции. Используя это, вы можете запомнить некоторую начальную позицию (перед рассматриваемым элементом), а затем конечную позицию ошибки. А затем прочитать эту часть из входного файла как обычный текст.
Не используйте никаких операций 'Read' на ридере - как вы обнаружили, это ускоряет его. Используйте вызовы свойств, таких как reader.HasValue
и reader.Value
для проверки содержимого. Найдите 'XmlReader' в обозревателе объектов, там довольно много свойств, которые вы можете прочитать.
Edit: Я не думаю, что есть простой способ просто получить XML, возможно потому, что текущий узел может не быть действительным XML сам по себе, например, узел XmlWhiteSpace, XmlText или даже XmlAttribute.