XmlSerialization - чтение тега конечного элемента?

2

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

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

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

Но что произойдет, если содержимое

<A i="32"/>

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

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

  • 0
    Я был там, где ты. Затем я переключился на Linq для Xml.
  • 0
    Я не хочу использовать Linq спасибо. Отчасти потому, что я хочу, чтобы моя библиотека была совместима с .NET 2.0, а отчасти потому, что я избегал Linq в других местах, где было бы очевидно использовать его из-за его более медленной производительности.
Теги:
xml-serialization

3 ответа

1
Лучший ответ

Оба XmlReader и XPathNavigator реализовать свойство под названием IsEmptyElement.

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

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

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

  • 0
    Хорошо, спасибо за информацию. Я полагаю, что неправильно понял, что имел в виду IsEmptyElement. Я предполагал, что атрибуты элемента означают, что он не пустой, но считаю, что это неправильно ...
  • 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
    Я предполагаю, что кто-то пытается сказать, что ваш комментарий неправильный ?? (Я не голосовал против этого).
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню