2017-06-13 3 views
0

別のものを期待されていなかった....XMLデシリアライズ<のRSSのxmlnsは=「」>これらの

私は、スタックオーバーフロー上の他の多くの例を通して見てきたし、この作品を作るソリューションを見つけていません。

エラー:

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が自動的にこれを逆シリアル化するようにビルドすることです。この例では、私のコードとまったく同じです。とても混乱するような。

答えて

1

問題は名前空間の1つです。 XMLのrss要素はデフォルトの名前空間にありますが、XmlRoot属性のgoogleRssにはhttp://base.google.com/ns/1.0という名前空間があります。

xmlns:g="..."という名前空間宣言は、接頭辞gに名前空間をバインドしますが、これは質問のXMLスニペットでは使用されません。

XmlRoot属性からNamespace値を削除します。

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

シリアライザコンストラクタからrssの既定の名前空間を削除します。

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

は、デモ用のthis fiddleを参照してください。

+0

完全に作業しました。だから明らかに...私はrssタグから名前空間を削除し、シリアライザからrssのルートを削除する組み合わせを試していない。私は最初の部分を取得するが、なぜ2番目の部分ですか?シリアライザのルートを宣言するのはなぜですか? –

+1

@JamieMarshallシリアライザでルートを宣言していません。 [rss]を[そのコンストラクタ]に渡すと(https://msdn.microsoft.com/en-us/library/kw0f5wee(v = vs.110).aspx)、*デフォルト名前空間*が設定されています。 'NamespaceName =" rss "をあなたの' XmlRoot'属性に追加するのとほぼ同じです。 –

-1

utf-16によるエラーが発生しています。 StringReaderから1行を読み込むだけで、行をスキップするだけです。

  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); 
       } 
     } 
関連する問題