2017-01-24 5 views
1

Ich versuche, die folgende Seite zu analysieren:wie sdmx-Datei in C# analysieren?

http://sdw-wsrest.ecb.europa.eu/service/data/YC/B.U2.EUR.4F.G_N_A.SV_C_YM.BETA0+BETA1+BETA2+BETA3+TAU1+TAU2?lastNObservations=1

zu erhalten, um den Wert von BETA0, BETA1, etc ....

Ich kämpfe wie es die Webseite in erscheint, ist SDMX-Format und nicht reguläres XML. Wenn jemand mit einem C# Snippet helfen kann, würde es sehr geschätzt werden.

Vielen Dank im Voraus.

+0

SDMX-ML ist XML nach diesem Link: https://sdmx.org/?page_id=5008 –

+0

@JohnKoerner, habe ich versucht, Verwenden von Nugget sdmxsource zum Analysieren der SDMX-Datei, jedoch ohne Erfolg. Ich habe auch versucht, Standard .Net XML-Bibliothek aber hier wieder ohne Erfolg zu verwenden. – akasolace

Antwort

1

Sie können die SDMXSource-Bibliothek verwenden, die für Java und .NET verfügbar ist.

Andernfalls, wenn Sie die gleichen Daten mit dem einfacheren strukturspezifischen Format und nicht mit dem generischen Format abrufen, können Sie die Daten möglicherweise ähnlich einem CSV-Format leichter analysieren. Um das strukturspezifische Format zu erhalten, setzen Sie den Accept-Header auf 'application/vnd.sdmx.stru structure specificdata + xml; version = 2.1'.

Sie könnten dies cheat sheet hilfreich finden.

UPDATE:

Hier ist ein Beispiel für das Parsen des strcuture bestimmten Format einen Schlüssel/Wert-Datensatz zu erzeugen, ohne eine Bibliothek. Es deckt nicht alle möglichen Fälle ab (z. B. Dataset-Level-Attribute), aber es ist ein guter Anfang und funktioniert für diese bestimmte Datennachricht.

XML:

<message:DataSet data:action="Replace" data:validFromDate="2017-01-25T22:31:14.760+01:00" data:structureRef="ECB_FMD2" data:dataScope="DataStructure" xsi:type="ecb_fmd2:DataSetType"> 
    <Series FREQ="B" REF_AREA="U2" CURRENCY="EUR" PROVIDER_FM="4F" INSTRUMENT_FM="G_N_A" PROVIDER_FM_ID="SV_C_YM" DATA_TYPE_FM="BETA0" COLLECTION="E" TITLE_COMPL="Euro area (changing composition) - Government bond, nominal, all issuers whose rating is triple A - Svensson model - continuous compounding - yield error minimisation - Yield curve parameters, Beta 0 - Euro, provided by ECB" DECIMALS="6" UNIT="PURE_NUMB" TITLE="Yield curve parameters, Beta 0 - Government bond, nominal, all issuers whose rating is triple A - Euro area (changing composition)" UNIT_MULT="0"> 
     <Obs TIME_PERIOD="2017-01-24" OBS_VALUE="1.775611976078084" OBS_STATUS="A" OBS_CONF="F"/> 
    </Series> 
    <Series FREQ="B" REF_AREA="U2" CURRENCY="EUR" PROVIDER_FM="4F" INSTRUMENT_FM="G_N_A" PROVIDER_FM_ID="SV_C_YM" DATA_TYPE_FM="BETA1" COLLECTION="E" TITLE_COMPL="Euro area (changing composition) - Government bond, nominal, all issuers whose rating is triple A - Svensson model - continuous compounding - yield error minimisation - Yield curve parameters, Beta 1 - Euro, provided by ECB" DECIMALS="6" UNIT="PURE_NUMB" TITLE="Yield curve parameters, Beta 1 - Government bond, nominal, all issuers whose rating is triple A - Euro area (changing composition)" UNIT_MULT="0"> 
     <Obs TIME_PERIOD="2017-01-24" OBS_VALUE="-2.438611976090857" OBS_STATUS="A" OBS_CONF="F"/> 
    </Series> 
    <Series FREQ="B" REF_AREA="U2" CURRENCY="EUR" PROVIDER_FM="4F" INSTRUMENT_FM="G_N_A" PROVIDER_FM_ID="SV_C_YM" DATA_TYPE_FM="BETA2" COLLECTION="E" TITLE_COMPL="Euro area (changing composition) - Government bond, nominal, all issuers whose rating is triple A - Svensson model - continuous compounding - yield error minimisation - Yield curve parameters, Beta 2 - Euro, provided by ECB" DECIMALS="6" UNIT="PURE_NUMB" TITLE="Yield curve parameters, Beta 2 - Government bond, nominal, all issuers whose rating is triple A - Euro area (changing composition)" UNIT_MULT="0"> 
     <Obs TIME_PERIOD="2017-01-24" OBS_VALUE="11.695146022367336" OBS_STATUS="A" OBS_CONF="F"/> 
    </Series>  
</message:DataSet> 

Code:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string path = @"data.xml"; 

     // An XmlReader created from a file on the disk or any stream like web request for example 
     using (var reader = XmlReader.Create(path)) 
     { 
      foreach (var item in GetRecords(reader)) 
      { 
       Debug.WriteLine(string.Join(", ", item.Select(i => string.Format("{0}={1}", i.Key, i.Value)))); 
      } 
     } 
    } 

    private static IEnumerable<Dictionary<string, string>> GetRecords(XmlReader reader) 
    { 
     Dictionary<string, string> record = null; 
     while (reader.Read()) 
     { 
      if (reader.IsStartElement() && reader.LocalName == "Series") 
      { 
       record = new Dictionary<string, string>(); 
       while (reader.MoveToNextAttribute()) 
       { 
        record.Add(reader.LocalName, reader.Value); 
       } 
      } 
      else if (reader.IsStartElement() && reader.LocalName == "Obs") 
      {     
       while (reader.MoveToNextAttribute()) 
       { 
        record.Add(reader.LocalName, reader.Value); 
       } 

       yield return record; 
      } 
     } 
    } 
} 
+0

Vielen Dank Duraid, ich werde versuchen, den Accept-Header zu ändern. In Bezug auf SDMXSource: 1. Die Dokumente zeigen kein praktisches Anwendungsbeispiel für das Retraving von Daten 2. Es scheint wirklich eine zu große Bibliothek für meinen kleinen Zweck Als Alternative erwäge ich auch, Regex zu verwenden. Vielen Dank .. – akasolace

+0

Gern geschehen. Wenn ich keine Bibliothek verwende, verwende ich einen XmlReader, um die Series- und Obs-Knoten zu durchlaufen und dann die Attribute für diese XML-Knoten zu lesen und den Attributnamen und -wert zu prüfen. – duraid

+0

Es funktioniert wirklich gut, vielen Dank für Ihre Hilfe! – akasolace