2015-11-10 3 views
1

Я пытаюсь разобрать следующий канал атом XML:SyndicationFeed Невозможно читать 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> 

C# код я использую:

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 

Я могу подключиться к веб-службе, и запросите информацию о дилере, как вы можете видеть. Но ошибка я получаю, когда SyndicationFeed начинает читать XML является:

«Элемент с именем" дилера и пространства имен „“ не является допустимым форматом подачи»

Может кто-то пожалуйста, пролить некоторый свет на этот для меня? Благодаря!!!

ответ

0

dealer недействительный тег для корня корма атома. Подробности см. На странице Atom Syndication Format RFC. Это должно быть atom:feed.

К сожалению, довольно редко можно найти недопустимые каналы RSS/Atom. SyndicationFeed является строгим, поэтому вам нужно немного массировать входные данные, чтобы заставить его работать.

Это уродливый, но простой подход - сделать String.Replace для тегов dealer.

// ...  

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

TextReader tr = new StringReader(readContent); 

// ... 

Я также фиксированные каналы в прошлом, выводя из XmlTextReader и фиксируя плохие элементы, как они читают.

Смежные вопросы