2017-06-13 1 views
0
erwartet

eine weitere dieser ....XML Deserialize <rss xmlns = ‚‘> wurde nicht

Ich habe viele andere Beispiele auf Stack-Überlauf durchgesehen und haben keine Lösung gefunden, die diese Arbeit macht.

Fehler:

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. 

Objektklasse:

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-Header (100% sicher, gut ausgebildet ist):

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

Executable Code:

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

Dieses Ding bringt mich um, ich bin seit Stunden dabei.

Die lustige Sache ist mein übliches Gehe zu Werkzeug ist, mein XML und vergangenes spezielles in VS Studio zu kopieren und die Klasse zu betrachten, die VS Studio automatisch baute, um dies zu deserialisieren. In diesem Fall ist es genauso wie mein Code. Sehr verwirrend.

Antwort

1

Das Problem ist einer der Namespaces. Das Element rss in Ihrem XML befindet sich im Standardnamespace, aber das -Attribut unter googleRss hat einen Namensbereich von http://base.google.com/ns/1.0.

Die Namespace-Deklaration von xmlns:g="..." bindet einen Namespace an das Präfix g, aber das wird nirgendwo im XML-Snippet in Ihrer Frage verwendet.

Entfernen Sie den Namespace Wert aus dem XmlRoot Attribute:

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

Und den Standard-Namespace von rss aus dem Serializer Konstruktor entfernen:

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

this fiddle für eine Demo sehen.

+0

Arbeitete perfekt. So offensichtlich ... Ich habe nicht die Kombination von Namespace aus RSS-Tag entfernen und RSS-Root aus dem Serializer entfernen. Ich bekomme den ersten Teil, aber warum der zweite? Warum dekonstruiert mein root für den Serializer es? –

+1

@JamieMarshall Sie deklarieren den Stamm im Serializer nicht. Das Übergeben von 'rss' an [diesen Konstruktor] (https://msdn.microsoft.com/en-us/library/kw0f5wee (v = vs.110) .aspx) setzt den * Standard-Namespace *. Es entspricht in etwa dem Hinzufügen von 'NamespaceName =" rss "' zu Ihrem 'XmlRoot'-Attribut. –

-1

Fehler tritt wegen utf-16 auf. Überspringen Sie einfach die Zeile, indem Sie eine Zeile aus dem StringReader lesen.

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