Преобразуйте строку XML для возражения

Я получаю строки XML по сокету и хотел бы преобразовать их в объекты C#.

Сообщения имеют форму:

<msg>
   <id>1</id>
   <action>stop</action>
</msg>

Я плохо знаком с .NET и не уверен лучшая практика для выполнения этого. Я использовал JAXB для Java прежде, и не было уверено, существует ли что-то подобное, или если это было бы обработано другой путь.

166
задан S.L. Barth - Reinstate Monica 10 September 2014 в 12:02
поделиться

5 ответов

Вам необходимо использовать инструмент 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);
261
ответ дан 23 November 2019 в 21:01
поделиться

Попробуйте этот метод для преобразования 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);
46
ответ дан 23 November 2019 в 21:01
поделиться

В дополнение к другим ответам здесь вы можете, естественно, использовать класс XmlDocument, для чтения XML DOM-подобного, или XmlReader, fast forward-only reader, чтобы сделать это "вручную".

0
ответ дан 23 November 2019 в 21:01
поделиться

Если у вас есть xsd xml-сообщения, вы можете сгенерировать классы C # с помощью инструмента .Net xsd.exe.

Эти классы .Net можно затем использовать для генерации xml.

0
ответ дан 23 November 2019 в 21:01
поделиться

Вы можете использовать xsd.exe для создания привязанных к схеме классов в .Net, а затем XmlSerializer для десериализации строки: http://msdn.microsoft.com/en-us/library/ system.xml.serialization.xmlserializer.deserialize.aspx

2
ответ дан 23 November 2019 в 21:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: