Deserializacja XML do obiektów w C#

Więc mam xml, który wygląda tak:

<todo-list>
  <id type="integer">#{id}</id>
  <name>#{name}</name>
  <description>#{description}</description>
  <project-id type="integer">#{project_id}</project-id>
  <milestone-id type="integer">#{milestone_id}</milestone-id>
  <position type="integer">#{position}</position>

  <!-- if user can see private lists -->
  <private type="boolean">#{private}</private>

  <!-- if the account supports time tracking -->
  <tracked type="boolean">#{tracked}</tracked>

  <!-- if todo-items are included in the response -->
  <todo-items type="array">
    <todo-item>
      ...
    </todo-item>
    <todo-item>
      ...
    </todo-item>
    ...
  </todo-items>
</todo-list>

Jak wykorzystać bibliotekę serializacji. NET do deserializacji tego do obiektów C#?

Obecnie używam reflection i mapuję między XML i moimi obiektami używając konwencji nazewnictwa.

Author: heguchi, 2008-10-22

8 answers

Tworzy klasę dla każdego elementu, która ma właściwość dla każdego elementu oraz listę lub tablicę obiektów (użyj utworzonej) dla każdego elementu potomnego. Następnie zadzwoń do systemu.Xml.Serializacja.XmlSerializer.Deserializuj na łańcuchu i rzuć wynik jako obiekt. Użyj systemu.Xml.Atrybuty serializacji aby dokonać korekt, np. mapować element do klasy ToDoList, użyj atrybutu XmlElement ("todo-list").

Shourtcut jest załadowanie XML do Visual Studio, kliknij Przycisk "Infer Schema" i uruchom " xsd.schemat exe / C.xsd " do generowania klas. xsd.exe znajduje się w folderze Narzędzia. Następnie przejdź przez wygenerowany kod i dokonaj korekt, takich jak zmiana szortów na ints, w razie potrzeby.

 58
Author: Dan Goldstein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-22 16:42:35

Sprowadza się do używania xsd.exe from tools in VS:

xsd.exe "%xsdFile%" /c /out:"%outDirectory%" /l:"%language%"

Następnie załaduj go za pomocą reader i deserializer:

public GeneratedClassFromXSD GetObjectFromXML()
{
    var settings = new XmlReaderSettings();
    var obj = new GeneratedClassFromXSD();
    var reader = XmlReader.Create(urlToService, settings);
    var serializer = new System.Xml.Serialization.XmlSerializer(typeof(GeneratedClassFromXSD));
    obj = (GeneratedClassFromXSD)serializer.Deserialize(reader);

    reader.Close();
    return obj;
}
 33
Author: Steve Horn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-30 14:50:04

Deserializuj dowolny obiekt, o ile typ {[1] } jest oznaczony Serializowalny:

function T Deserialize<T>(string serializedResults)
{
    var serializer = new XmlSerializer(typeof(T));
    using (var stringReader = new StringReader(serializedResults))
        return (T)serializer.Deserialize(stringReader);
}
 14
Author: Keith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-12 13:23:41

Cóż, musiałbyś mieć w swoim zestawie klasy, które pasują, mniej więcej, do XML (właściwość o nazwie Private, właściwość kolekcji o nazwie ToDo, itp.).

Problem polega na tym, że XML zawiera elementy, które są nieprawidłowe dla nazw klas . Więc będziesz musiał zaimplementować IXmlSerializable w tych klasach, aby kontrolować, jak są one serializowane do iz XML. Być może uda ci się uciec od używania niektórych specyficznych atrybutów serializacji xml, ale zależy to od Twojego xml schemat.

To jest krok powyżej za pomocą refleksji, ale może nie być dokładnie to, na co liczysz.

 4
Author: Will,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-22 16:42:18

Checkout http://xsd2code.codeplex.com/

Xsd2code jest generatorem klasy Csharp lub Visual Basic Business Entity ze schematu XSD.

 4
Author: Deepfreezed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-15 23:35:26

Istnieje kilka różnych opcji.

    Visual Studio zawiera program z linii poleceń o nazwie xsd.exe. Używasz tego programu do tworzenia dokumentu schematu i ponownie używasz go w dokumencie schematu do tworzenia klas, których możesz używać z system.xml.serialization.xmlserializer Możesz po prostu zadzwonić do Dataset.ReadXml () na nim.
 3
Author: Joel Coehoorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-22 16:39:55

Powinieneś rzucić okiem na http://www.canerten.com/xml-c-class-generator-for-c-using-xsd-for-deserialization/

Istnieje (Microsoft) narzędzie, które pomaga stworzyć XSD potrzebne do prawidłowego deserializacji XML do obiektu

 3
Author: Luk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-22 16:41:05

Miałem te same pytania kilka lat temu, jak ABT mapowanie XML do klas C# lub tworzenie klas C#, które są mapowane do naszych XMLs, jst, jak to robimy w entity Framework (mapujemy tabele do klas C#). W końcu stworzyłem framework, który może tworzyć klasy C# z twojego XML i te klasy mogą być używane do odczytu/zapisu twojego xml. Have a look

 -1
Author: Savaratkar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-24 10:49:46