Я получаю строки XML по сокету и хотел бы преобразовать их в объекты C#.
Сообщения имеют форму:
<msg>
<id>1</id>
<action>stop</action>
</msg>
Я плохо знаком с .NET и не уверен лучшая практика для выполнения этого. Я использовал JAXB для Java прежде, и не было уверено, существует ли что-то подобное, или если это было бы обработано другой путь.
Вам необходимо использовать инструмент xsd.exe
, который устанавливается вместе с Windows SDK в каталог, похожий на:
C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin
И на 64-битных компьютерах:
C:\Program Files (x86)\Microsoft SDKs\Windows\v6.0A\bin
А на компьютерах с Windows 10:
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin
При первом запуске вы используете xsd.exe
и конвертируете образец XML в файл XSD (файл схемы XML):
xsd yourfile.xml
Это дает вам yourfile.xsd
, который на втором этапе вы можете снова преобразовать с помощью xsd.exe
в класс C #:
xsd yourfile.xsd /c
В результате вы получите файл yourfile.cs
, который будет содержать класс C #, который вы можете использовать для десериализации получаемого XML-файла - что-то вроде:
XmlSerializer serializer = new XmlSerializer(typeof(msg));
msg resultingMessage = (msg)serializer.Deserialize(new XmlTextReader("yourfile.xml"));
Должен хорошо работать в большинстве случаев.
Обновление: XML-сериализатор будет принимать любой поток в качестве входных данных - подойдет либо файл, либо поток памяти:
XmlSerializer serializer = new XmlSerializer(typeof(msg));
MemoryStream memStream = new MemoryStream(Encoding.UTF8.GetBytes(inputString));
msg resultingMessage = (msg)serializer.Deserialize(memStream);
или используйте StringReader:
XmlSerializer serializer = new XmlSerializer(typeof(msg));
StringReader rdr = new StringReader(inputString);
msg resultingMessage = (msg)serializer.Deserialize(rdr);
Попробуйте этот метод для преобразования XML в объект.Он предназначен именно для того, что вы делаете:
protected T FromXml<T>(String xml)
{
T returnedXmlClass = default(T);
try
{
using (TextReader reader = new StringReader(xml))
{
try
{
returnedXmlClass =
(T)new XmlSerializer(typeof(T)).Deserialize(reader);
}
catch (InvalidOperationException)
{
// String passed is not XML, simply return defaultXmlClass
}
}
}
catch (Exception ex)
{
}
return returnedXmlClass ;
}
Назовите его, используя этот код:
YourStrongTypedEntity entity = FromXml<YourStrongTypedEntity>(YourMsgString);
В дополнение к другим ответам здесь вы можете, естественно, использовать класс XmlDocument, для чтения XML DOM-подобного, или XmlReader, fast forward-only reader, чтобы сделать это "вручную".
Если у вас есть xsd xml-сообщения, вы можете сгенерировать классы C # с помощью инструмента .Net xsd.exe.
Эти классы .Net можно затем использовать для генерации xml.
Вы можете использовать xsd.exe для создания привязанных к схеме классов в .Net, а затем XmlSerializer для десериализации строки: http://msdn.microsoft.com/en-us/library/ system.xml.serialization.xmlserializer.deserialize.aspx