2015-11-10 2 views
1

Je suis en train d'analyser le flux XML atome suivant:SyndicationFeed Impossible de lire ATOM

<dealer version="1.12" xmlns:atom="http://www.w3.org/2005/Atom"><atom:link rel="self" href="http://Blah.com/dealers/1234"/><atom:link rel="http://Blah.com/rels/dealer_notification_prefs" href="http://Blah.com/dealers/1234/notification_prefs"/><atom:link rel="http://Blah.com/rels/dealer_systems" href="http://Blah.com/dealers/1234/systems"/><atom:link rel="http://Blah.com/rels/dealer_logo" href="http://Blah.com/dealers/1234/logo"/><pid>1234</pid><name>ABC Heating &amp; Air Conditioning</name><first>X</first><last>X</last><street1>PO Box 321</street1><street2/><city>Orson</city><state>IN</state><country>United States</country><postal>46142</postal><phone>317-555-5555</phone><phoneExt/><url></url><email>[email protected]</email></dealer> 

Le code C# J'utilise est:

using (var client = new HttpClient()) // Using block for disposing of HttpClient when finished 
     { 
      client.DefaultRequestHeaders.Accept.Clear(); 
      client.BaseAddress = new Uri(_baseUriPart); // Set to core base Uri for whole Api 
      client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("OAuth", _builtParamsString); 

      // Send HTTP Requests Async 

      try 
      { 
       bool respSuccess = false; 


       HttpResponseMessage response = await client.GetAsync(_resourceUriPart); 
       //HttpResponseMessage response = await client.SendAsync(myRequestTest); 
       response.EnsureSuccessStatusCode(); // Throw Exception if not a success code. // ...} 

       Stream stream = await response.Content.ReadAsStreamAsync(); 
       var prereader = new StreamReader(stream); 
       string readContent = prereader.ReadToEnd(); 

       string readOut = string.Empty; 

       TextReader tr = new StringReader(readContent); 

       XmlReader reader = XmlReader.Create(tr); 

       SyndicationFeed feed = SyndicationFeed.Load(reader); 
       if(null!=feed) 
       {      
       foreach(var item in feed.Items) 
       { 
        //readOut = readOut + item.Title.Text + ":" + ((TextSyndicationContent)item.Content).Text+ Environment.NewLine; 
       } 
       } 
       respSuccess = response.IsSuccessStatusCode; 
       TextBox1.Text = respSuccess.ToString(); 
       TextBox2.Text = response.StatusCode.ToString(); 
       TextBox3.Text = readOut; 
      } 
      catch (HttpRequestException e) 
      { 
       TextBox1.Text = "False"; 
       TextBox2.Text = "See Content Message"; 
       TextBox3.Text = e.Message; 
      } 
     } // End using block 

Je peux vous connecter au service Web, et demandez l'information du concessionnaire comme vous pouvez le voir. Mais l'erreur que je reçois quand l'SyndicationFeed commence à lire le code XML est:

«L'élément avec le nom du revendeur 'et « » namespace est pas un format d'alimentation autorisé »

Quelqu'un peut-il s'il vous plaît faire la lumière sur cette pour moi? Merci!!!

Répondre

0

dealer n'est pas une balise valide pour la racine du flux atomique. Voir le Atom Syndication Format RFC pour plus de détails. Il devrait être atom:feed.

Il est malheureusement assez courant de trouver des flux RSS/Atom invalides. SyndicationFeed est strict, donc vous devez faire un peu de massage des données d'entrée pour le faire fonctionner. Il est moche mais l'approche simple est de faire un String.Replace pour les étiquettes dealer.

// ...  

readContent = readContent.Replace("&lt;dealer ", "&lt;atom:feed ").Replace("&lt;/dealer&gt;", "&lt;/atom:feed&gt;"); 

TextReader tr = new StringReader(readContent); 

// ... 

J'ai aussi les flux fixes dans le passé en dérivant de XmlTextReader et fixant les mauvais éléments tels qu'ils sont lus.