XML反序列化< rss xmlns =''>没想到 [英] XML Deserialize <rss xmlns=''> was not expected

查看:67
本文介绍了XML反序列化< rss xmlns =''>没想到的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

其中一个。...

我已经研究了Stack Overflow上的许多其他示例,但没有找到一种可以使这项工作成功的解决方案。

I've looked through many other examples on Stack Overflow and have not found a solution that makes this work.

错误:

    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 Header (100% sure is well formed):

<?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);
          }
     }

这东西正在杀了我,我一直在几个小时。

This thing is killing me, I've been on it for hours.

有趣的是,我通常使用的工具是将XML和过去的特殊代码复制到VS Studio中,然后查看VS Studio将自动构建的类以反序列化。在这种情况下,它与我的代码完全相同。非常混淆。

The funny thing is my usual go to tool is to copy my XML and past special into VS Studio and look at the class VS Studio would automatically build to deserialize this. In this instance, its the exact same as my code. Very confusing.

推荐答案

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

The issue is one of namespaces. The rss element in your XML is in the default namespace, but the XmlRoot attribute on googleRss has a namespace of http://base.google.com/ns/1.0.

xmlns:g = ... 的名称空间声明将名称空间绑定到前缀 g ,但这不会在您的问题的XML片段中任何地方使用。

The namespace declaration of xmlns:g="..." binds a namespace to the prefix g, but this isn't used anywhere in the snippet of XML in your question.

Namespace 值中删除 XmlRoot 属性:

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

并删除 rss的默认命名空间来自序列化程序构造函数:

And remove the default namespace of rss from the serializer constructor:

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

请参见此小提琴进行演示。

这篇关于XML反序列化&lt; rss xmlns =''&gt;没想到的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆