XML反序列化在Windows Phone C#

问题描述:

我正在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

类:我的序列化/反序列化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