XmlSerialization - чтение тега конечного элемента? - PullRequest
2 голосов
/ 17 июля 2009

Я недавно прочитал информацию об интерфейсе IXmlSerializable на MSDN, и был немного озадачен всей вещью конечного тега.

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

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

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

<A i="32"/>

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

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

Ответы [ 3 ]

2 голосов
/ 17 июля 2009

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

1 голос
/ 17 июля 2009

Оба XmlReader и XPathNavigator реализуют свойство с именем IsEmptyElement.

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

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

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

0 голосов
/ 17 июля 2009

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

public class Wrapper {
    public A Wrapped;
}

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

Полагаю, вам нужно прочитать <Wrapped> и </Wrapped>, но не </Wrapper>.

...