2012-07-18 97 views
2

我正在WP應用程序的新聞門戶網站,我需要解析各種提要。標準飼料看起來是這樣的:XML反序列化在Windows Phone C#

<feed> 
    <items> 
     <item> 
      ... 
     </item> 
     <item> 
      ... 
     </item> 
    </items> 
</feed> 

,我使用此代碼反序列化:

XDocument document = XDocument.Load(xmlStream); 
XmlSerializer serializer = new XmlSerializer(typeof(News)); 
News MainPage = (News)serializer.Deserialize(document.CreateReader()); 
Dispatcher.BeginInvoke(() => MainPageListBox.ItemsSource = MainPage.DataSet;); 

新聞類看起來是這樣的:

[XmlRoot("feed")] 
public class News 
{ 
    [XmlArray("items")] 
    [XmlArrayItem("item")] 
    public ObservableCollection<NewsItem> DataSet{ get; set; } 
} 

每飼料這項工作很好有這個結構有一個<items>部分。但我也有喂具有多個部分,例如:

如果我使用上面的C#代碼中,只有第一<items>部分解析,其它的被忽略。我需要爲單個XML Feed中的每個<items>部分創建單獨的List或ObservableCollection。

任何人都可以幫助我嗎?非常感謝。

+0

XML與類的格式不匹配......您不能使用序列化程序反序列化回您的對象。 – 2012-07-18 06:08:53

+0

http://eyeung003.blogspot.com/2010/03/c-net-35-syndication.html – 2012-07-18 06:31:21

回答

2

類:我的序列化/反序列化XML

[XmlRoot("feed")] 
    public class News 
    { 
     [XmlArray("items")] 
     public List<NewsItemCollection> DataSet { get; set; } 

     public News() 
     { 
      DataSet = new List<NewsItemCollection>(); 
     } 
    } 

    public class NewsItemCollection 
    { 
     [XmlAttribute("section")] 
     public string Section { get; set; } 

     [XmlElement("item")] 
     public ObservableCollection<NewsItem> Items { get; set; } 

     public NewsItemCollection() 
     { 
      Items = new ObservableCollection<NewsItem>(); 
     } 
    } 

    public class NewsItem 
    { 
     public string Title { get; set; } 
    } 

一些輔助類:

public static class ObjectExtensions 
    { 
     /// <summary> 
     /// <para>Serializes the specified System.Object and writes the XML document</para> 
     /// <para>to the specified file.</para> 
     /// </summary> 
     /// <typeparam name="T">This item's type</typeparam> 
     /// <param name="item">This item</param> 
     /// <param name="fileName">The file to which you want to write.</param> 
     /// <returns>true if successful, otherwise false.</returns> 
     public static bool XmlSerialize<T>(this T item, string fileName) 
     { 
      return item.XmlSerialize(fileName, true); 
     } 

     /// <summary> 
     /// <para>Serializes the specified System.Object and writes the XML document</para> 
     /// <para>to the specified file.</para> 
     /// </summary> 
     /// <typeparam name="T">This item's type</typeparam> 
     /// <param name="item">This item</param> 
     /// <param name="fileName">The file to which you want to write.</param> 
     /// <param name="removeNamespaces"> 
     ///  <para>Specify whether to remove xml namespaces.</para>para> 
     ///  <para>If your object has any XmlInclude attributes, then set this to false</para> 
     /// </param> 
     /// <returns>true if successful, otherwise false.</returns> 
     public static bool XmlSerialize<T>(this T item, string fileName, bool removeNamespaces) 
     { 
      object locker = new object(); 

      XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces(); 
      xmlns.Add(string.Empty, string.Empty); 

      XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); 

      XmlWriterSettings settings = new XmlWriterSettings(); 
      settings.Indent = true; 
      settings.OmitXmlDeclaration = true; 

      lock (locker) 
      { 
       using (XmlWriter writer = XmlWriter.Create(fileName, settings)) 
       { 
        if (removeNamespaces) 
        { 
         xmlSerializer.Serialize(writer, item, xmlns); 
        } 
        else { xmlSerializer.Serialize(writer, item); } 

        writer.Close(); 
       } 
      } 

      return true; 
     } 

     /// <summary> 
     /// Serializes the specified System.Object and returns the serialized XML 
     /// </summary> 
     /// <typeparam name="T">This item's type</typeparam> 
     /// <param name="item">This item</param> 
     /// <returns>Serialized XML for specified System.Object</returns> 
     public static string XmlSerialize<T>(this T item) 
     { 
      return item.XmlSerialize(true); 
     } 

     /// <summary> 
     /// Serializes the specified System.Object and returns the serialized XML 
     /// </summary> 
     /// <typeparam name="T">This item's type</typeparam> 
     /// <param name="item">This item</param> 
     /// <param name="removeNamespaces"> 
     ///  <para>Specify whether to remove xml namespaces.</para>para> 
     ///  <para>If your object has any XmlInclude attributes, then set this to false</para> 
     /// </param> 
     /// <returns>Serialized XML for specified System.Object</returns> 
     public static string XmlSerialize<T>(this T item, bool removeNamespaces) 
     { 
      object locker = new object(); 

      XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces(); 
      xmlns.Add(string.Empty, string.Empty); 

      XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); 

      XmlWriterSettings settings = new XmlWriterSettings(); 
      settings.Indent = true; 
      settings.OmitXmlDeclaration = true; 

      lock (locker) 
      { 
       StringBuilder stringBuilder = new StringBuilder(); 
       using (StringWriter stringWriter = new StringWriter(stringBuilder)) 
       { 
        using (XmlWriter xmlWriter = XmlWriter.Create(stringWriter, settings)) 
        { 
         if (removeNamespaces) 
         { 
          xmlSerializer.Serialize(xmlWriter, item, xmlns); 
         } 
         else { xmlSerializer.Serialize(xmlWriter, item); } 

         return stringBuilder.ToString(); 
        } 
       } 
      } 
     } 
    } 

public static class StringExtensions 
    { 
     /// <summary> 
     /// Deserializes the XML data contained by the specified System.String 
     /// </summary> 
     /// <typeparam name="T">The type of System.Object to be deserialized</typeparam> 
     /// <param name="s">The System.String containing XML data</param> 
     /// <returns>The System.Object being deserialized.</returns> 
     public static T XmlDeserialize<T>(this string s) 
     { 
      var locker = new object(); 
      var stringReader = new StringReader(s); 
      var reader = new XmlTextReader(stringReader); 
      try 
      { 
       var xmlSerializer = new XmlSerializer(typeof(T)); 
       lock (locker) 
       { 
        var item = (T)xmlSerializer.Deserialize(reader); 
        reader.Close(); 
        return item; 
       } 
      } 
      catch 
      { 
       return default(T); 
      } 
      finally 
      { 
       reader.Close(); 
      } 
     } 
    } 

試運行:

News news = new News(); 
      news.DataSet.Add(new NewsItemCollection 
      { 
       Section = "Section1", 
       Items = new ObservableCollection<NewsItem> 
        { 
         new NewsItem { Title = "Test1.1" }, 
         new NewsItem { Title = "Test1.2" } 
        } 
      }); 
      news.DataSet.Add(new NewsItemCollection 
      { 
       Section = "Section2", 
       Items = new ObservableCollection<NewsItem> 
        { 
         new NewsItem { Title = "Test2.1" }, 
         new NewsItem { Title = "Test2.2" } 
        } 
      }); 

      var serialized = news.XmlSerialize(); 
      var deserialized = serialized.XmlDeserialize<News>(); 

玩得開心!

+1

爲什麼需要'鎖'? – 2013-08-07 14:57:38