2010-03-08 11 views
5

Il mio obiettivo è quello di estrarre dati XML dall'API e caricarlo in un database SQL Server. Il primo passo che sto tentando qui è quello di accedere ai dati e visualizzarli. Una volta ottenuto questo lavoro, eseguirò un ciclo di ogni riga e inserirò i valori in un database SQL Server. Quando provo a eseguire il codice qui sotto non succede nulla e quando ho incollare l'URL direttamente nel browser ottengo questo erroreCome accedere e lavorare con XML da API in C#

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

A me sembra che ogni iterazione del ciclo foreach effettua una chiamata al sito e ho resta bloccato per un'ora. Sto recuperando i dati dall'API in modo errato? Esiste un modo per caricare i dati in memoria o un array per poi passarci sopra?

Ecco il bit di codice che ho hackerato insieme.

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

Ecco un esempio del 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

Questa domanda è specifica per l'API specifica. Solo chi conosce questa specifica API potrebbe dirti perché si comporta in questo modo. –

+1

Eve ha un forum per sviluppatori e pubblicherò anche questa domanda, ma ho pensato che si trattasse più di una domanda di programmazione generale su come lavorare correttamente con i dati XML. – Jerry

risposta

4

Un rapido di ricerca (google) mostra che this is the EVE API cache mechanism kicking in. Se interrogate gli stessi dati dalla stessa chiave e IP, vi dice di riutilizzare ciò che avete già. Quindi assicurati di scrivere qualsiasi risultato tu do vai su disco o database subito. Alcuni tempi di cache sono 1 giorno ...

+0

Quindi, come faccio a farlo? Dovrei usare il metodo descritto nel post qui sotto (classe WebClient e il suo metodo DownloadFile) o ci sono altri modi per archiviare i dati prima di inserirli in un database? http://stackoverflow.com/questions/1576534/how-to-read-xml-data-from-a-url-by-using-vb-net-and-save/1576729#1576729 – Jerry

1

@Jarek È possibile archiviare il file xml come cache locale nella struttura del file webserver come .../Users/thisusersid/mycustomfile_02102011.xml, quindi quando l'utente registra di nuovo basta tirare il file, dividere il nome del file, controllare le date e utilizzare il file più recente come predefinito. Quindi è possibile consentire all'utente di aggiornare manualmente i propri dati dall'evacle manualmente facendo clic su un pulsante/collegamento per recuperare l'ultimo massimo &.