簡體   English   中英

如何在c#中解析sdmx文件?

[英]how to parse sdmx file in c#?

我正在嘗試解析以下頁面:

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

為了獲得BETA0BETA1等的值......

我很掙扎,因為網頁似乎是 SDMX 格式而不是常規 XML。 如果有人可以幫助使用 ac# 片段,我們將不勝感激。

先感謝您。

您可以使用可用於 Java 和 .NET 的SDMXSource庫。

否則,如果您使用更簡單的結構特定格式而不是通用格式檢索相同的數據,您可能可以更輕松地解析數據,類似於 CSV 格式。 為了獲得特定於結構的格式,將 Accept 標頭設置為“application/vnd.sdmx.structurespecificdata+xml;version=2.1”。

您可能會發現此備忘單很有幫助。

更新:

這是解析結構特定格式以在不使用庫的情況下生成鍵/值記錄的示例。 它並未涵蓋所有可能的情況(例如數據集級別的屬性),但這是一個良好的開端,並且適用於此特定數據消息。

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>

代碼:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM