C # Разбор курсов обмена XML в словарь из ЕЦБ - PullRequest
0 голосов
/ 26 июня 2018

Используя этот URL от Европейского центрального банка:

www.ecb.europa.eu / stats / eurofxref / eurofxref-daily.xml

Я хотел быимпортировать символ валюты и курс в словарь или объект.У меня есть его чтение в XML-документ, но у меня проблемы с выбором атрибутов узла.

Спасибо

string xmlString;
        using (var client = new WebClient())
        {
            xmlString = client.DownloadString("http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml");
        }

        var xmlDoc = new XmlDocument();
        xmlDoc.LoadXml(xmlString);

        foreach(XmlNode node  in xmlDoc.SelectNodes("//*/Cube/@currency"))
        {
            // add currency and rate to dictionary
        }

Ответы [ 4 ]

0 голосов
/ 26 июня 2018

Я думаю, что проблема связана с вашим селектором xPath.

Значение "//*[@currency]" выберет все элементы с атрибутом "currency"

class Program
{
    public static void Main(string[] args)
    {
        List<Rate> rates = new List<Rate>();

        var doc = new XmlDocument();
        doc.Load(@"http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml");

        XmlNodeList nodes = doc.SelectNodes("//*[@currency]");

        if (nodes != null)
        {
            foreach (XmlNode node in nodes)
            {
                var rate = new Rate()
                           {
                              Currency = node.Attributes["currency"].Value,
                              Value = Decimal.Parse(node.Attributes["rate"].Value, NumberStyles.Any, new CultureInfo("en-Us"))
                           };
                rates.Add(rate);
            }
        }
    }
}
class Rate
{
    public string Currency { get; set; }
    public decimal Value { get; set; }
}
0 голосов
/ 26 июня 2018
        string xmlString;
        using (var client = new WebClient())
        {
            xmlString = client.DownloadString("http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml");
        }

    var doc = XDocument.Parse(xmlString);
    XNamespace ns = "http://www.ecb.int/vocabulary/2002-08-01/eurofxref";
    var values = doc
        .Root
        .Element(ns + "Cube")             
        .Element(ns + "Cube")
        .Elements(ns + "Cube")
        .ToDictionary(e => e.Attribute("currency"), e => (double) e.Attribute("rate"));
0 голосов
/ 26 июня 2018

Если выражение XPath не содержит префикса, предполагается, что URI пространства имен является пустым пространством имен.Если ваш XML включает пространство имен по умолчанию, вы все равно должны добавить префикс и URI пространства имен в XmlNamespaceManager;в противном случае вы не получите ни одного выбранного узла.

Используйте эту перегрузку XmlNode.SelectNodes (String, XmlNamespaceManager) .

XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDoc.NameTable);
nsmgr.AddNamespace("ecb", "http://www.ecb.int/vocabulary/2002-08-01/eurofxref");
foreach (XmlNode node in xmlDoc.SelectNodes("//ecb:Cube[@currency]", nsmgr))
0 голосов
/ 26 июня 2018
class Program
{
    static void Main(string[] args)
    {
        List<Rate> rates = new List<Rate>();

        var doc = new XmlDocument();
        doc.Load(@"http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml");

        XmlNodeList nodes = doc.SelectNodes("/*/*/*/*");

        for (int i = 0; i < nodes.Count; i++)
        {
            var rate = new Rate()
            {
                Currency = nodes[i].Attributes[0].Value,
                Value = Decimal.Parse(nodes[i].Attributes[1].Value)
            };

            rates.Add(rate);
        }
        Console.WriteLine();
    }
}

class Rate
{
    public string Currency { get; set; }
    public decimal Value { get; set; }
}
...