Это вопрос из двух частей. Первый - это конкретный вопрос о DataSets и XML. Второй - более общий вопрос типа «я правильно понимаю». Хотя я, безусловно, буду благодарен за ответы, которые отвечают на оба вопроса, я также приветствую ответы, которые касаются только одного или другого!
Вопрос 1
Поддерживает ли класс DataSet элементы смешанного сложного типа ? Например, допустим, у меня есть следующий XML:
<cars>
<car id="1">10000
<colour>blue</colour>
<doors>4</doors>
</car>
</cars>
XSD, описывающий этот XML, будет иметь сложный тип с атрибутом «mixed», установленным в true. Это позволяет мне указывать стоимость моей машины (10 000 долларов США) в виде обычного текста, а затем любые другие элементы, которые мне нужны.
Однако, когда я преобразовываю этот XML в DataSet и возвращаюсь снова, используя следующий код:
StringReader sr = new StringReader(xml);
DataSet dataset = new DataSet();
dataset.ReadXml(sr);
sr.Close();
StringWriter sw = new StringWriter();
dataset.WriteXml(sw);
xml = sw.ToString();
sw.Close();
Тогда полученный XML выглядит следующим образом:
<cars>
<car id="1">
<colour>blue</colour>
<doors>4</doors>
</car>
</cars>
т.е. значение "10000" пропадает.
Это происходит не только в том случае, если у меня есть вызов ReadXml (), который выводит схему XML (как указано выше), но также если я предоставляю XSD (например, путем вызова ReadXmlSchema ()).
Есть ли способ избежать этого? Или я должен просто избегать смешанных типов?
Вопрос 2
Существуют ли какие-либо другие ограничения, такие как описанные выше, о которых мне следует знать при преобразовании XML в наборы данных и наоборот?
Или, возможно, Вопрос 1 показывает, что я иду в обратном порядке. На данный момент я начинаю с желаемого XML (например, с примерами автомобилей выше) и преобразую его в DataSet. Цель состоит в том, чтобы сохранить данные в виде XML в базе данных, и когда я захочу отобразить эти данные в WinForm, я преобразую XML в DataSet и буду использовать привязку данных к различным таблицам в DataSet. Но вместо того, чтобы начинать с XSD, возможно, мне следует сначала определить свои данные как (типизированный) DataSet, а затем позволить методам ReadXml / WriteXml позаботиться о том, как выглядит XML?