2009-07-17 2 views
2

Недавно я прочитал информацию об интерфейсе IXmlSerializable на MSDN и немного смутился по поводу всего тега конца.XmlSerialization - чтение тега End Element?

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

<A> 
    <i>32</i> 
</A> 

Но что происходит, если содержание

<A i="32"/> 

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

Я думаю, что я просто немного потерялся, так как код, с которым я работаю, немного сложнее, когда мне приходится иметь дело с IXmlSerializable детьми (которые могут быть разных типов) и коллекциями элементов IXmlSerializable ,

+0

Я был там, где вы есть. Затем я перешел на Linq в Xml. – Will

+0

Я не хочу использовать Linq. Отчасти потому, что я хочу, чтобы моя библиотека была совместима с .NET 2.0, а отчасти потому, что я избегал Linq в другом месте, где было бы очевидно использовать его из-за его более низкой производительности. – Ian

ответ

1

И XmlReader, и XPathNavigator осуществляют недвижимость под названием IsEmptyElement.

Из документации:

При переопределении в производном классе получает значение, показывающее, является ли текущий узел пустым элементом без конечного тега элемента.

Так что, когда вы видите событие запуска элемента, если IsEmptyElement является true вы не должны смотреть на события конца элемента. Событие start-element действует как начало и конец для этого случая.

+0

Хорошо, спасибо за информацию. Я считаю, что неправильно понял, что означал IsEmptyElement. Я предположил, что атрибуты на элементе означают, что он не пуст, но верьте, что это неверно ... – Ian

+0

Этот ответ поможет, спасибо. Я сделал то же неправильное предположение, что и Ян, я думаю, что свойство не называется интуитивно. –

2

Я вспоминаю XmlReader.IsEmptyElement. В начале тега, если это установлено, вы имеете <a />. Если он не установлен, у вас есть <a></a>. Последний вы читаете конечный тег, а у вас нет.

-1

Я думаю, что это немного о том, не читая закрывающий тег для сценария, когда ваш объект встроен в более крупную структуру:

public class Wrapper { 
    public A Wrapped; 
} 

<Wrapper> 
    <Wrapped><i>32</i></Wrapped> 
</Wrapper> 

Я ожидаю, что вы должны будете читать <Wrapped> и </Wrapped>, но не </Wrapper>.

+0

Причина для нисходящего потока? –

+0

Я предполагаю, что кто-то пытается сказать, что ваш комментарий неправильный ?? (Я не голосовал). – Ian

+0

Было бы хорошо знать, где я ошибаюсь, поэтому не повторяю. –

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