2015-02-02 3 views
2

Я ищу чистый и короткий способ десериализации объекта XmlDocument. Самое близкое, что я нашел, было this, но мне действительно интересно, нет ли лучшего способа сделать это (в .NET 4.5 или даже 4.6), так как у меня уже есть XmlDocument.Самый короткий способ десериализации XmlDocument

Так в данный момент это выглядит следующим образом:

// aciResponse.Data is a XmlDocument 
MyClass response; 
using (XmlReader reader = XmlReader.Create((new StringReader(aciResponse.Data.InnerXml)))) 
{ 
    var serializer = new XmlSerializer(typeof(MyClass)); 
    response = (MyClass)serializer.Deserialize(reader); 
} 

Спасибо за любые идеи!

+0

Можете ли вы уточнить, что именно вы думаете, может стать способом «лучше»/«чище»? –

+0

хорошо, что-то, что, возможно, не связано с созданием/открытием двух разных читателей и использованием InnerXml (string)? – silent

+0

Это то, что методы и методы расширения для, если вы делаете много одного и того же кода, извлеките функцию ... Этот код выглядит довольно кратким для меня; поэтому, вероятно, будет более конкретным. –

ответ

5

Вы можете отказаться от XmlReader и использовать вместо этого TextReader и использовать перегрузку TextReaderXmlSerializer.Deserialize Method.

Рабочий пример:

void Main() 
{ 
    String aciResponseData = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><tag><bar>test</bar></tag>"; 
    using(TextReader sr = new StringReader(aciResponseData)) 
    { 
     var serializer = new System.Xml.Serialization.XmlSerializer(typeof(MyClass)); 
     MyClass response = (MyClass)serializer.Deserialize(sr); 
     Console.WriteLine(response.bar); 
    } 
} 

[System.Xml.Serialization.XmlRoot("tag")] 
public class MyClass 
{ 
    public String bar; 
} 
+1

Ну, это хотя бы немного более короткое решение :) Я буду ждать, однако, если может быть больше предложений. – silent

4

Если у вас уже есть XmlDocument объект, чем вы могли бы использовать XmlNodeReader

MyClass response = null; 
XmlSerializer serializer = new XmlSerializer(typeof(MyClass)); 
using (XmlReader reader = new XmlNodeReader(aciResponse.Data)) 
{ 
    response = (MyClass)serializer.Deserialize(reader); 
} 
1

Существует лучший и ленивый способ сделать это. Но это возможно, только если вы используете Visual Studio.

Шаги:

  1. Откройте Visual Studio и создайте новый файл класса (скажем, Sample1.cs). Теперь удалите определение класса образца из этого файла класса.
  2. Скопируйте XML-файл в буфер обмена (Ctrl + A, Ctrl + C)
  3. В Visual Studio перейдите в меню «Правка» и выберите «Вставить специальный» -> «Вставить XML как классы».

Выполнено. Visual Studio будет генерировать все определения классов, необходимые для де-сериализации этого XML.

 Смежные вопросы

  • Нет связанных вопросов^_^