2017-06-13 4 views
0

Un autre de ces ....XML Deserialize <rss xmlns = « »> n'a pas été prévu

Je l'ai regardé par beaucoup d'autres exemples sur Stack Overflow et n'ont pas trouvé une solution qui fait ce travail.

Erreur:

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. 

classe de l'objet:

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 en-tête (100% est sûr bien formé):

<?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> 
    .... 

Code Objet:

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

Cette chose me tue, je l'ai été pendant des heures. La chose amusante est mon habitude aller à l'outil est de copier mon XML et passé spécial dans VS Studio et regarder la classe que VS Studio construirait automatiquement pour désérialiser cela. Dans ce cas, c'est exactement la même chose que mon code. Très perturbant.

Répondre

1

Le problème est l'un des espaces de noms. L'élément rss dans votre XML est dans l'espace de nom par défaut, mais l'attribut XmlRoot sur googleRss a un espace de noms de http://base.google.com/ns/1.0. La déclaration d'espace de noms de xmlns:g="..." lie un espace de noms au préfixe g, mais il n'est utilisé nulle part dans l'extrait XML de votre question.

Retirez la valeur Namespace de l'XmlRoot attribut:

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

et supprimer l'espace de noms par défaut de rss du constructeur sérialiseur:

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

Voir this fiddle pour une démonstration.

+0

A travaillé parfaitement. Alors évidemment ... je n'ai pas essayé la combinaison de supprimer l'espace de noms de la balise rss et supprimer la racine rss du sérialiseur. Je reçois la première partie, mais pourquoi la seconde? Pourquoi déclarer ma racine pour le sérialiseur? –

+1

@JamieMarshall Vous ne déclarez pas la racine dans le sérialiseur. Passer 'rss' à [ce constructeur] (https://msdn.microsoft.com/en-us/library/kw0f5wee (v = vs.110) .aspx) définit l'espace de noms * par défaut *. Cela équivaut à ajouter 'NamespaceName =" rss "' à votre attribut 'XmlRoot'. –

-1

Une erreur est survenue en raison de l'utf-16. Ignorez simplement la ligne en lisant une ligne du 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); 
       } 
     }