Как читать из XmlReader, не перемещая его вперед

эй парни, у меня есть этот сценарий:

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 читателя, не вмешиваясь в, он - положение?

8
задан abatishchev 7 March 2013 в 03:47
поделиться

2 ответа

На самом деле ReadSubtree вернет читателя, который "обернет" оригинального читателя. Так что чтение через новый читатель в конечном итоге продвинет и исходный. Вы должны рассматривать XmlReader как читателя только вперед, он просто не может вернуться назад. Что касается вашего сценария, то вместо того, чтобы пытаться запомнить часть XML, вы можете спросить читателя о позиции во входном файле. Просто перейдите к интерфейсу IXmlLineInfo, у него есть методы для возврата строки и позиции. Используя это, вы можете запомнить некоторую начальную позицию (перед рассматриваемым элементом), а затем конечную позицию ошибки. А затем прочитать эту часть из входного файла как обычный текст.

10
ответ дан 5 December 2019 в 11:22
поделиться

Не используйте никаких операций 'Read' на ридере - как вы обнаружили, это ускоряет его. Используйте вызовы свойств, таких как reader.HasValue и reader.Value для проверки содержимого. Найдите 'XmlReader' в обозревателе объектов, там довольно много свойств, которые вы можете прочитать.

Edit: Я не думаю, что есть простой способ просто получить XML, возможно потому, что текущий узел может не быть действительным XML сам по себе, например, узел XmlWhiteSpace, XmlText или даже XmlAttribute.

3
ответ дан 5 December 2019 в 11:22
поделиться
Другие вопросы по тегам:

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