Asp.net XML для объектов

У меня есть XML-файл со структурой вроде

<items>
  <item>
    <someDetail>
      A value here
     </someDetail>
  </item>
  <item>
    <someDetail>
      Another value here
     </someDetail>
  </item>
</items>

С несколькими предметами в нем.

Я хочу в идеале десериализовать XML при запуске сеанса, чтобы преобразовать данные XML в объекты на основе класса (c # asp.net 4)

Я пробовал несколько способов либо безуспешно, либо решение, которое кажется неуклюжим и неэлегантным.

Что бы люди посоветовали?

Я пробовал использовать инструмент xsd.exe и пробовал с классом чтения xml, а также классом usin XElement для циклического просмотра xml и затем создания нового someObject (props).

Это, возможно, лучший и / или единственный способ, но поскольку он настолько прост для источников баз данных, использующих структуру сущностей, я задавался вопросом, есть ли аналогичный способ сделать то же самое, но из источника xml.


person atmd    schedule 11.04.2012    source источник
comment
Я пробовал несколько способов - например,? Не могли бы вы перечислить их и объяснить, почему они не подходили? Я не хочу предлагать вещи, которые вы уже отклонили.   -  person Oded    schedule 11.04.2012
comment
По этому поводу уже есть несколько хороших постов. Вы можете проверить: http://stackoverflow.com/questions/3187444/c-sharp-convert-xml-string-to-object   -  person KingOfHypocrites    schedule 11.04.2012
comment
Привет, приведенная выше ссылка была одной из двух сообщений о SO, которые я видел с помощью инструментов xsd. Просто интересно, нет ли там ничего лучше. Это скорее вопрос о передовой практике / оптимальном решении, а не простое «как»   -  person atmd    schedule 11.04.2012


Ответы (3)


Лучший способ десериализации XML - это создать класс, соответствующий структуре XML, в которую будут десериализоваться данные XML.

Новейшая технология сериализации использует контракты данных и _ 1_.

Вы украшаете упомянутый выше класс атрибутами DataMember и DataItem и используете сериализатор для десериализации.

person Oded    schedule 11.04.2012

Я бы использовал напрямую сериализацию .NET XML - объявления классов:

public class Item {

  [XmlElement("someDetail")]
  public string SomeDetail;

} // class Item


[XmlRoot("items")]
public class MyData {

  [XmlElement("item")]
  public List<Item> Items;

  public static MyData Deserialize(Stream source)
  {
    XmlSerializer serializer = new XmlSerializer(typeof(MyData));
    return serializer.Deserialize(source) as MyData;
  } // Deserialize

} // class MyData

а затем прочитать XML:

  using (FileStream fs = new FileStream(@"c:\temp\items.xml", FileMode.Open, FileAccess.Read)) {
    MyData myData = MyData.Deserialize(fs);
  }
person MiMo    schedule 11.04.2012
comment
XmlSerializer старый, а новые DataContractSerializer дают вам больше контроля. - person Oded; 11.04.2012
comment
Я привык к XmlSerializer, и он работает нормально - я не нашел (пока?) Веской причины попробовать что-то другое. - person MiMo; 11.04.2012
comment
Одна из веских причин - когда вам нужно несколько разных форматов сериализации - например, XML и JSON. Легко сделать с DataContractSerializer, а не с XmlSerializer. - person Oded; 11.04.2012
comment
@Oded, спасибо за эту информацию - я не знаю, как бы я когда-либо узнал об этом в противном случае - изначально, как вы связываете его имя с его функциональностью (другими словами, как я это запомню)? - person Aaron Anodide; 12.04.2012
comment
@Oded, хорошо, и это лучший универсальный сериализатор xml - это то, к чему вы клоните. Я понимаю. - person Aaron Anodide; 12.04.2012
comment
@Gabriel - дает вам лучший контроль над сериализацией и десериализацией и поддерживает XML и JSON. - person Oded; 12.04.2012

Я пришел к выводу, что простого унифицированного механизма нет (вероятно, из-за присущих ему сложностей, связанных с нетривиальными случаями - этот вопрос всегда возникает в контексте простых сценариев, таких как ваш пример xml).

Сериализация XML довольно проста в использовании. В вашем примере вам просто нужно будет создать класс, содержащий элементы, и другой класс для фактического элемента. Возможно, вам придется применить некоторые атрибуты, чтобы все работало правильно, но кодирования будет немного. Тогда это так же просто, как -

var serializer = new XmlSerializer(typeof(ItemsContainer));
var items = serializer.Deserialize(...) as ItemsContainer;

Наборы данных иногда считают «технологией вчерашнего дня», но я использую их, когда они хорошо решают проблему, и вы можете воспользоваться услугами дизайнера. Сгенерированный код некрасив, но суть в том, что вы можете сохранять данные в базе данных через автоматически сгенерированные адаптеры и в XML, используя метод прямо в наборе данных. Вы тоже можете прочитать это так.

XSD.exe не так уж и плох, если к нему привыкнуть. Я распечатал справку в текстовом файле и на время включил ее в свои решения. Когда вы используете параметр / c для создания классов, вы получаете чистый код, который можно использовать с XmlSerialzier.

В Visual Studio 2010 (возможно, и в других версиях) есть меню XML, которое появляется, когда у вас открыт файл Xml, и из него вы также можете сгенерировать XSD из образца Xml. Итак, за пару шагов вы можете взять свой пример xml и сгенерировать XSD, затем запустить его через XSD.exe и использовать сгенерированные классы с парой строк кода XmlSerializer ... это похоже на множество махинаций, но вы привыкли к нему.

person Aaron Anodide    schedule 11.04.2012