不希望XML反序列化<rss xmlns =“”>

时间:2017-06-13 00:38:32

标签: c# xml rss deserialization

另外一个......

我已经查看了Stack Overflow上的许多其他示例,并且没有找到使其工作的解决方案。

错误:

    There is an error in XML document (1, 41).
System.Xml
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader)
   at CatalogInterface_1_1.MainWindow.cmdConvertToGoogle_Click(Object sender, RoutedEventArgs e) in C:\Users\Jamie.Marshall\Documents\Visual Studio 2015\Projects\CatalogInterface_1_1\CatalogInterface_1_1\MainWindow.xaml.cs:line 239
<rss xmlns=''> was not expected.

对象类:

public class GCatalog
{
    [XmlType(AnonymousType = true)]
    [XmlRoot(ElementName = "rss", Namespace = "http://base.google.com/ns/1.0")]
    public partial class googleRss
    {
        [XmlAttribute("Version")]
        public string Version { get; set; }
        [XmlElement("channel")]
        public rssChannel Channel { get; set; }
    }
    [XmlType(AnonymousType = true)]
    public partial class rssChannel
    {
        public string title { get; set;  }
        public string link { get; set; }
        public string description { get; set; }
        [XmlElement("Item")]
        public Page Items { get; set; }
    }
    [XmlRoot(ElementName = "rss", Namespace = "http://base.google.com/ns/1.0")]
    public class Page : List<Item> { }
    [XmlType("Item")]
    public class Item
    {
        #region private properties
        private props.....
        #endregion

        #region public propterties
        [XmlElement("id", Namespace = "http://base.google.com/ns/1.0")]
        public string id {get; set; }
        [XmlElement("availabilityid", Namespace = "http://base.google.com/ns/1.0")]
        public string availability {get; set; }
        [XmlElement("condition", Namespace = "http://base.google.com/ns/1.0")]
        public string condition {get; set; }
        [XmlElement("description", Namespace = "http://base.google.com/ns/1.0")]
        public string description {get; set; }
        [XmlElement("image_link", Namespace = "http://base.google.com/ns/1.0")]
        public string image_link {get; set; }
        [XmlElement("link", Namespace = "http://base.google.com/ns/1.0")]
        public string link {get; set; }
        [XmlElement("title", Namespace = "http://base.google.com/ns/1.0")]
        public string title {get; set; }
        [XmlElement("price", Namespace = "http://base.google.com/ns/1.0")]
        public string price {get; set; }
        [XmlElement("brand", Namespace = "http://base.google.com/ns/1.0")]
        public string brand {get; set; }
        [XmlElement("identifier_exists", Namespace = "http://base.google.com/ns/1.0")]
        public string identifier_exists {get; set; }
        [XmlElement("additional_image_link", Namespace = "http://base.google.com/ns/1.0")]
        public string additional_image_link {get; set; }
        [XmlElement("google_product_category", Namespace = "http://base.google.com/ns/1.0")]
        public string google_product_category {get; set; }
        [XmlElement("product_type", Namespace = "http://base.google.com/ns/1.0")]
        public string product_type {get; set; }
        [XmlElement("sale_price", Namespace = "http://base.google.com/ns/1.0")]
        public string sale_price {get; set; }
        [XmlElement("sale_price_effective_date", Namespace = "http://base.google.com/ns/1.0")]
        public string sale_price_effective_date {get; set; }
    }
}

XML标头(100%确定格式正确):

<?xml version="1.0" encoding="utf-16"?>
<rss xmlns:g="http://base.google.com/ns/1.0" Version="2.0">
  <channel>
    <title>CatalogFB</title>
    <link>https://store.playstation.com/#!/en-us</link>
    <description>All Items in Catalog</description>
    <Item> 
    ....

可执行代码:

     FBCatalog.googleRss dataObject = new FBCatalog.googleRss();
     using (XmlReader reader = XmlReader.Create(new StringReader(xml.InnerXml)))
     {
          var serializer = new XmlSerializer(typeof(FBCatalog.googleRss), "rss");
          dataObject = (FBCatalog.googleRss)serializer.Deserialize(reader);
          GCatalog.Page page = new GCatalog.Page();
          counter = 0;

          foreach (var ITEM in dataObject.Channel.Items)
          {
              GCatalog.Item gItem = GCatalog.ConvertToGItem(ITEM);
              page.Add(gItem);
          }
     }

这件事让我很伤心,我已经好几个小时了。

有趣的是,我通常使用的工具是将我的XML和过去的特殊内容复制到VS Studio中,然后查看VS Studio将自动构建的类以反序列化它。在这个例子中,它与我的代码完全相同。很混乱。

2 个答案:

答案 0 :(得分:1)

问题是命名空间之一。 XML中的rss元素位于默认命名空间中,但XmlRoot上的googleRss属性的命名空间为http://base.google.com/ns/1.0

xmlns:g="..."的名称空间声明将名称空间绑定到前缀g,但在您的问题的XML片段中没有使用它。

Namespace属性中删除XmlRoot值:

[XmlRoot(ElementName = "rss")]
public partial class googleRss

从序列化器构造函数中删除rss的默认命名空间:

var serializer = new XmlSerializer(typeof(GCatalog.googleRss));

请参阅this fiddle了解演示。

答案 1 :(得分:-1)

由于utf-16而发生错误。只需从StringReader中读取一行即可跳过行。

         FBCatalog.googleRss dataObject = new FBCatalog.googleRss();
         using (StringReader sReader = new StringReader(xml.InnerXml))
         {
              sReader.ReadLine();
              XmlReader reader = XmlReader.Create(sReader);
              var serializer = new XmlSerializer(typeof(FBCatalog.googleRss), "rss");
          dataObject = (FBCatalog.googleRss)serializer.Deserialize(reader);
          GCatalog.Page page = new GCatalog.Page();
          counter = 0;
          foreach (var ITEM in dataObject.Channel.Items)
               {
                   GCatalog.Item gItem = GCatalog.ConvertToGItem(ITEM);
                   page.Add(gItem);
               }
        }