Как мне сопоставить XML с объектами C # - PullRequest
28 голосов
/ 18 сентября 2008

У меня есть XML, который я хочу загрузить в объекты, манипулировать этими объектами (устанавливать значения, читать значения), а затем сохранять эти XML обратно. Для меня важно иметь XML в структуре (xsd), которую я создал.

Один из способов сделать это - написать свой собственный сериализатор, но есть ли в C # встроенная поддержка или открытый исходный код, который я могу использовать?

Ответы [ 9 ]

28 голосов
/ 18 сентября 2008

Вы можете генерировать сериализуемые классы C # из схемы (xsd), используя xsd.exe:

xsd.exe dependency1.xsd dependency2.xsd schema.xsd /out:outputDir

Если схема имеет зависимости (включенные / импортированные схемы), все они должны быть включены в одну командную строку.

18 голосов
/ 18 сентября 2008

Этот код (C # DotNet 1.0 и далее) работает достаточно хорошо для сериализации большинства объектов в XML. (и назад) Он не работает для объектов, содержащих ArrayLists, и, если возможно, использует только Arrays

using System;    
using System.IO;
using System.Text;
using System.Xml.Serialization;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;


public static string Serialize(object objectToSerialize)
{
    MemoryStream mem = new MemoryStream();          
    XmlSerializer ser = new XmlSerializer(objectToSerialize.GetType());         
    ser.Serialize(mem, objectToSerialize);                      
    ASCIIEncoding ascii = new ASCIIEncoding();
    return ascii.GetString(mem.ToArray());
}        

public static object Deserialize(Type typeToDeserialize, string xmlString)
{
    byte[] bytes = Encoding.UTF8.GetBytes(xmlString);
    MemoryStream mem = new MemoryStream(bytes);         
    XmlSerializer ser = new XmlSerializer(typeToDeserialize);
    return ser.Deserialize(mem);
}
7 голосов
/ 18 сентября 2008

LINQ to XML очень мощно, если вы используете .net 3.5, LINQ to XSD может быть полезно и вам!

2 голосов
/ 18 сентября 2008

с использованием System.Xml.Serialization; это пространство имен имеет все атрибуты, которые вам понадобятся, если вы хотите отобразить ваш xml на любой случайный объект. В качестве альтернативы вы можете использовать инструмент xsd.exe

xsd file.xsd {/ classes | / набор данных} [/ element: element] [/ language: language] [/ namespace: namespace] [/ outputdir: каталог] [URI: uri] который возьмет ваши xsd-файлы и создаст из них классы c # или vb.net.

http://msdn.microsoft.com/en-us/library/x6c1kb0s(VS.71).aspx

2 голосов
/ 18 сентября 2008

Используйте программу командной строки xsd.exe, которая поставляется вместе с Visual Studio, для создания файлов классов, которые вы можете использовать в своем проекте / решении, и пространство имен System.Xml.Serialization (в частности, класс XmlSerializer) для сериализации / десериализации этих классов. и с диска.

1 голос
/ 20 января 2012

Я согласен, что xsd действительно дерьмо ... Но они сделали другую версию, о которой мало кто знает. Его называют генератором объектов xsd. Его следующая версия и имеет гораздо больше возможностей. Он генерирует файлы из XSD и работает фантастически. Если у вас есть генератор схемы, такой как XML spy; создайте xsd из вашего xml и используйте этот инструмент. Я создал очень очень сложные классы, используя этот инструмент. Затем создайте частичные классы для дополнительных свойств \ методов и т. Д. Затем, когда вы обновляете свою схему, вы просто восстанавливаете свои классы, и любые изменения сохраняются в ваших частичных классах.

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=7075

1 голос
/ 13 сентября 2011

Мы создали структуру, которая может автоматически генерировать классы C # из вашего XML. Это шаблон визуального элемента, в который вы передаете свой XML, и классы автоматически генерируются в вашем проекте. Используя эти классы, вы можете создавать / читать / писать свой XML.

Проверьте эту ссылку для шаблона и шаблона элемента Visual C #: нажмите здесь

1 голос
/ 18 апреля 2011

xsd.exe от Microsoft имеет много ошибок: | Попробуйте это жемчужина с открытым исходным кодом http://xsd2code.codeplex.com/

0 голосов
/ 18 сентября 2008

Готов поспорить, NetDataContractSerializer может делать то, что вы хотите.

...