2012-04-27 2 views
1

Я читал эти дни о десериализации, DOM, LINQ to XML и LINQ to XSD ... на некоторое время, но поскольку я новичок, я действительно не получаю целая картинка, поэтому я попытаюсь объяснить вам мои пейзажи:Передача данных в виде из XML

Я извлекаю xml из чужих, и я просто пытаюсь отобразить информацию, которая поставляется вместе с ним в представлении проекта MVC.

У меня действительно нет xsd, поэтому я считаю, что для десериализации его в объект мне придется использовать инструмент XSD для создания схемы, а затем класс, который соответствует этой схеме, а затем заполняет этот класс и использует его в вид. Я думаю, что это можно сделать только с образцом xml, правильно?

Другой вариант - создать «мой объект» и заполнить его через DOM. Я сделал что-то подобное в последнее время (я задал вопрос об этом) или даже попробовал некоторые из подходов LINQ (я прочитал, что LINQ to XSD был оставлен Microsoft).

Для простой вещи, которую я пытаюсь сделать, я бы пошел на LINQ to XML, но, честно говоря, я не полностью понял все различия, которые я прочитал о преимуществах и недостатках различных подходов, поэтому, если кто-то может помочь мне решить, что я действительно ценю это.

Заранее спасибо

ответ

1

Я поделюсь XMLManager мы используем в моем текущем проекте. Это очень просто в использовании, вы просто передать в типе объекта, который вы хотите serialze и из, например:

YourObject myObject = new YourObject(); 
myObject.SomeInfoString = "Hello World"; 
XMLManager<YourObject>.SerialzeToFile(myObject, pathToSaveTo) 

YourObject loadedObject = XMLManager<YourObject>.SerialzeFromFile(pathToYourFile) 

Вот реализация (обратите внимание, вы можете захотеть сделать что-то в улове-статьях , я удалил, что мы делаем здесь, потому что это конкретное, чтобы из реализации):

using System; 
using System.Diagnostics; 
using System.IO; 
using System.Reflection; 
using System.Xml; 
using System.Xml.Serialization; 

/// <summary> 
/// The XMLManager can be used to serialize to and from XML files. 
/// </summary> 
/// <typeparam name="T">The type to serialize.</typeparam> 
public static class XmlManager<T> 
{ 
    /// <summary> 
    /// Static method SerializeFromFile 
    /// </summary> 
    /// <param name="path"> 
    /// The path. 
    /// </param> 
    /// <returns> 
    /// returns T 
    /// </returns> 
    public static T SerializeFromFile(string path) 
    { 
     try 
     { 
      using (var xmlStream = new FileStream(path, FileMode.Open)) 
      { 
       return FromStream(xmlStream); 
      } 
     } 
     catch (Exception ex) 
     { 
      return default(T); 
     } 
    } 

    /// <summary> 
    /// Method FromStream 
    /// </summary> 
    /// <param name="xmlStream"> 
    /// The xml stream. 
    /// </param> 
    /// <returns> 
    /// returns T 
    /// </returns> 
    public static T FromStream(Stream xmlStream) 
    { 
     try 
     { 
      var xmlReader = XmlReader.Create(xmlStream); 
      var serializer = new XmlSerializer(typeof(T)); 

      var value = (T)serializer.Deserialize(xmlReader); 
      return value; 
     } 
     catch (Exception ex) 
     { 
      return default(T); 
     } 
    } 

    /// <summary> 
    /// Method SerializeToFile 
    /// </summary> 
    /// <param name="xmlObject"> 
    /// The xml object. 
    /// </param> 
    /// <param name="xmlPath"> 
    /// The xml path. 
    /// </param> 
    /// <param name="overwriteExisting"> 
    /// The overwrite existing. 
    /// </param> 
    public static void SerializeToFile(T xmlObject, string xmlPath, bool overwriteExisting) 
    { 
     try 
     { 
      var mode = overwriteExisting ? FileMode.Create : FileMode.CreateNew; 
      using (var xmlStream = new FileStream(xmlPath, mode)) 
      { 
       ToStream(xmlObject, xmlStream); 
      } 
     } 
     catch (Exception ex) 
     { 
     } 
    } 

    /// <summary> 
    /// Method ToStream 
    /// </summary> 
    /// <param name="xmlObject"> 
    /// The xml object. 
    /// </param> 
    /// <param name="xmlStream"> 
    /// The xml stream. 
    /// </param> 
    public static void ToStream(T xmlObject, Stream xmlStream) 
    { 
     try 
     { 
      var xmlSettings = new XmlWriterSettings { Indent = true, NewLineOnAttributes = false }; 

      var writer = XmlWriter.Create(xmlStream, xmlSettings); 
      var serializer = new XmlSerializer(typeof(T)); 

      serializer.Serialize(writer, xmlObject); 
     } 
     catch (Exception ex) 
     { 
     } 
    } 
} 

чтобы передать эту информацию в целях вы делаете недвижимость в ViewModel объекта вы десериализованный с помощью XMLManager, и свяжите его через XAML.

public string MyObjectInfoString 
{ 
    get 
    { 
     return this.myObject.InfoString; 
    } 

    set 
    { 
     if (this.myObject.InfoString == value) 
     { 
      return; 
     } 

     this.myObject.InfoString = value; 
     RaisePropertyChanged("MyObjectInfoString"); 
    } 
} 

[Редактировать] Может также показать XAML, а также:

<TextBlock Text="{Binding MyObjectInfoString}" /> 
+0

Спасибо большое, Amadeus. Но то, что я хотел бы знать, больше, чем конкретная реализация, - это то, какой подход лучше всего подходит для моего xml не очень сложного – mitomed

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