2010-03-08 23 views
5

Mi objetivo es extraer datos XML de la API y cargarlos en una base de datos de servidor SQL. El primer paso que intento aquí es acceder a los datos y mostrarlos. Una vez que lo haga funcionar, recorreré cada fila e insertaré los valores en una base de datos de servidor sql. Cuando trato de ejecutar el código de abajo no pasa nada y cuando me pega la URL directamente en el navegador me sale este errorCómo acceder y trabajar con XML desde API en C#

"2010-03-08 04:24:17 Wallet exhausted: retry after 2010-03-08 05:23:58. 2010-03-08 05:23:58" 

Me parece que cada iteración del bucle foreach realiza una llamada al sitio y yo ser bloqueado por una hora ¿Estoy recuperando datos de la API de manera incorrecta? ¿Hay alguna manera de cargar los datos en la memoria o en una matriz y luego recorrerlos?

Aquí está el código que pirateé.

using System; 
using System.Data.SqlClient; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Xml; 
using System.Data; 

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     try 
     { 
      string userID = "123"; 
      string apiKey = "abc456"; 
      string characterID = "789"; 
      string url = "http://api.eve-online.com/char/WalletTransactions.xml.aspx?userID=" + userID + "&apiKey=" + apiKey + "&characterID=" + characterID; 
      XmlDocument xmldoc = new XmlDocument(); 
      xmldoc.Load(url); 
      XmlNamespaceManager xnm1 = new XmlNamespaceManager(xmldoc.NameTable); 
      XmlNodeList nList1 = xmldoc.SelectNodes("result/rowset/row", xnm1); 
      foreach (XmlNode xNode in nList1) 
      { 
       Response.Write(xNode.InnerXml + "<br />"); 
      } 
     } 

     catch (SqlException em) 
     { 
      Response.Write(em.Message); 
     } 
    } 
} 

He aquí una muestra de la xml

<eveapi version="2"> 
    <currentTime>2010-03-06 17:38:35</currentTime> 
    <result> 
    <rowset name="transactions" key="transactionID" columns="transactionDateTime,transactionID,quantity,typeName,typeID,price,clientID,clientName,stationID,stationName,transactionType,transactionFor"> 
     <row transactionDateTime="2010-03-06 17:16:00" transactionID="1343566007" quantity="1" typeName="Co-Processor II" typeID="3888" price="1122999.00" clientID="1404318579" clientName="unseenstrike" stationID="60011572" stationName="Osmeden IX - Moon 6 - University of Caille School" transactionType="sell" transactionFor="personal" /> 
     <row transactionDateTime="2010-03-06 17:15:00" transactionID="1343565894" quantity="1" typeName="Co-Processor II" typeID="3888" price="1150000.00" clientID="1404318579" clientName="unseenstrike" stationID="60011572" stationName="Osmeden IX - Moon 6 - University of Caille School" transactionType="sell" transactionFor="personal" /> 
    </rowset> 
    </result> 
    <cachedUntil>2010-03-06 17:53:35</cachedUntil> 
</eveapi> 
+3

Esta pregunta es específica para la API concreta. Solo alguien que conozca esta API específica podría decirle por qué se comporta de esa manera. –

+1

Eve tiene un foro de desarrolladores y publicaré esta pregunta también allí, pero pensé que esto era más una pregunta de programación general sobre cómo trabajar correctamente con datos XML. – Jerry

Respuesta

4

un poco de búsqueda rápida (Google) muestra que this is the EVE API cache mechanism kicking in. Si consulta los mismos datos desde la misma clave e IP, le indica que vuelva a utilizar lo que ya tiene. Así que asegúrese de escribir los resultados que hacer obtener en el disco o la base de datos inmediatamente. Algunas veces caché son de 1 los días ...

+0

Entonces, ¿cómo hago para hacer eso? ¿Debo usar el método descrito en la publicación a continuación (clase WebClient y su método DownloadFile) o hay otras formas de almacenar los datos antes de insertarlos en una base de datos? http://stackoverflow.com/questions/1576534/how-to-read-xml-data-from-a-url-by-using-vb-net-and-save/1576729#1576729 – Jerry

1

@Jarek Se podía almacenar el archivo XML como una caché local de la estructura de archivos como servidores web .../Users/thisusersid/mycustomfile_02102011.xml, a continuación, cuando el usuario inicia sesión de nuevo, simplemente extraiga el archivo, divida el nombre del archivo, verifique las fechas y utilice el archivo más reciente como predeterminado. Luego puede permitir que el usuario actualice sus datos desde el eveapi manualmente haciendo clic en un botón/enlace para recuperar el último & más grande.

Cuestiones relacionadas