DCSIMG
שערי מטבע מבנק ישראל ב - C# - שלמה גולדברג (הרב דוטנט)

שלמה גולדברג (הרב דוטנט)

מרצה בסלע ויועץ בעולם ה - net.

שערי מטבע מבנק ישראל ב - C#

 

ראשית כל אני רוצה להדגיש, שהדוגמא להלן מייבאת את שערי המטבעות מהאתר של בנק ישראל וכדי להציג את התוכן באתר שלכם, אתם צריכים לקבל מהם אישור, כאן יש כתובת מייל (בתחתית העמוד) שניתן לבקש אישורים להצגת התוכן באתר שלכם.
 
 
לעניינינו. לבנק ישראל יש שירות של שערי המטבעות בקבצי xml.
כתבתי class שיודע להחזיק את התוכן של אותו קובץ xml. את ה - class המלא תוכלו להוריד מכאן. בפוסט הזה אני רוצה להראות את המתודות Fill (שמביאות את התוכן מבנק ישראל)
 
 
יש לנו enum בשם CurrencyCode
 

    public enum CurrencyCode

    {

        All = 0,

        SAL = 77,

        USD = 01,

        GBP = 02,

        JPY = 31,

        EUR = 27,

        AUD = 18,

        CAD = 06,

        DKK = 12,

        NOK = 28,

        ZAR = 17,

        SEK = 3,

        CHF = 5,

        JOD = 69,

        LBP = 70,

        EGP = 79

    }

 
הנה ה - class:
 

    public class ExchangeRating

    {

        public string Name { get; set; }

        public int Unit { get; set; }

        public CurrencyCode CurrencyCode { get; set; }

        public string Country { get; set; }

        public double Change { get; set; }

        public double Rate { get; set; }

    }

 
והנה מתודת ה - Fill (ההסברים למטה)
 

public void Fill()

{

    Rates.Clear();

 

 

    WebClient webClient = new WebClient();

 

    string url = "";

 

    if (Code.Contains(CurrencyCode.All))

    {

        url = string.Format("http://www.bankisrael.gov.il/heb.shearim/currency.php?rdate={0}{1}{2}",

            LastUpdate.Year,

            LastUpdate.Month.ToString().Length == 2 ?

                LastUpdate.Month.ToString() :

                "0" + LastUpdate.Month.ToString(),

            LastUpdate.Day.ToString().Length == 2 ?

                LastUpdate.Day.ToString() :

                "0" + LastUpdate.Day.ToString());

 

        InternalFill(webClient, url);

 

    }

    else

    {

        foreach (var item in Code)

        {

            url = string.Format("http://www.bankisrael.gov.il/heb.shearim/currency.php?rdate={0}{1}{2}&curr={3}",

                            LastUpdate.Year,

                            LastUpdate.Month.ToString().Length == 2 ?

                                LastUpdate.Month.ToString() :

                                "0" + LastUpdate.Month.ToString(),

                            LastUpdate.Day.ToString().Length == 2 ?

                                LastUpdate.Day.ToString() :

                                "0" + LastUpdate.Day.ToString(),

                            ((int)item).ToString().Length == 2 ?

                                ((int)item).ToString() :

                                "0" + ((int)item).ToString());

 

            InternalFill(webClient, url);

        }

    }

 

}

 

private void InternalFill(WebClient webClient, string url)

{

    string res = webClient.DownloadString(url);

 

    XmlDocument doc = new XmlDocument();

    doc.LoadXml(res);

 

    foreach (XmlNode item in doc["CURRENCIES"].GetElementsByTagName("CURRENCY"))

    {

        Rates.Add(new ExchangeRating()

        {

            Change = double.Parse(item["CHANGE"].InnerText),

            Country = item["COUNTRY"].InnerText,

            CurrencyCode = (CurrencyCode)Enum.Parse(typeof(CurrencyCode),

                            item["CURRENCYCODE"].InnerText),

            Name = item["NAME"].InnerText,

            Unit = int.Parse(item["UNIT"].InnerText),

            Rate = double.Parse(item["RATE"].InnerText)

        });

    }

 

    if (Rates.Count == 0)

    {

        StringBuilder builder = new StringBuilder();

        foreach (XmlNode item in doc["CURRENCIES"])

        {

            if (item.Name.Contains("ERROR"))

            {

                builder.Append(item.InnerText);

                builder.Append(Environment.NewLine);

            }

        }

        if (builder.Length > 0)

        {

            throw new Exception(builder.ToString());

        }

    }

}

 
מתודת ה - Fill בודקת האם רוצים להביא את כל המטבעות או רק חלק מהם.
במידה ורוצים להביא את כל המטבעות, צריך לפנות את האתר רק עם התאריך (והוא צריך להיות בפורמט YYYYMMDD - ולכן יש שם קוד טיפה ארוך כדי להחזיק את הפורמט המתאים)
במידה ורוצים רק חלק מהמטבעות, רצים בלולאה על כל המטבעות הרצויים, ומפעילים את internalFill.
 
ב - InternalFill  פונים לאתר דרך WebClient ומורידים את קובץ ה - xml, טוענים אותו ל XmlDocument ומתחילים למלא את האובייקטים מקובץ ה - xml.
 
במידה ואין שום data, בודקים האם ב - xml מופיע שגיאות, במידה וכן זורקים exception עם השגיאות.
 
פורסם: Jul 19 2009, 08:59 AM by Shlomo | with 11 comment(s)
תגים:, ,

תוכן התגובה

Guy Burstein כתב/ה:

היי

התייחסות לקוד הנ"ל:

1. אני לא הייתי מעביר את ה- WebClient לתוך המתודה, אלא את ה- string שמחזירה המתודה DownloadString. יכול להיות שתרצה לפעמים להפעיל את WebClient.DownloadAsync ואזלבנות את התשובה מתוצאה שחוזרת.

2. למה אתה משתמש ב- XmlDocument ומבצע Parsing של ה- InnerText של האלמנטים השונים במקום להשתמש ב- LINQ to Xml? האם אתה מוגבל ל- .Net Framework 2.0?

# July 19, 2009 10:38 AM

Shlomo כתב/ה:

1. צודק.

2. אני לא מוגבל, ל - 2.0, סתם יצא לי ככה.

# July 19, 2009 10:58 AM

שי יעקובי כתב/ה:

פתרון יפה,

הייתי בונה SERVICE או משימה מתוזמנת או JOB בSQL שירוץ כל מספר דקות ותשמור את הנתונים בדטבייס.

שי

# July 19, 2009 4:24 PM

Shay Levy כתב/ה:

In this post (hebrew), Shlomo Goldberg , shows how we can receive currency exchange rates from Bank Of

# July 19, 2009 4:34 PM

Shlomo כתב/ה:

צודק, אני כתבתי את ה - class כל אחד מוזמן לקחת את זה הלאה ולפתח את זה.

# July 19, 2009 5:22 PM

Rotem Bloom כתב/ה:

מסכים לחלוטין לגבי ההערה של גיא בורשטיין לגבי עבודה עם LINQ TO XML בהחלט מומלץ לעבוד עם זה ולא עם XMLDOCUMENT.

יש אפשרות נוספת וזה לכתוב על ה-CLASS שלך ATTRIBUTES של XML ואז לעשות DESerialize.

אפשר לקרוא על זה גם פה:

blogs.microsoft.co.il/.../customize-your-net-object-xml-serialization-with-net-xml-attributes.aspx

# July 21, 2009 1:11 PM

שלמה גולדברג כתב/ה:

נניח שרוצים לקשר בין TreeView לבין קובץ xml נקח לדוגמא את קובץ שערי המטבעות מבנק ישראל (שאפשר גם לעבוד

# February 25, 2010 12:03 PM

ליאור חדיאן כתב/ה:

תודה רבה לך על המחלקה הנהדרת :)

# May 18, 2010 6:17 PM

genadysh כתב/ה:

נחמד, אבל הצעתו של בורשטיין היא יותר יעילה...

לקחת את מה שחוזר ולבנות אובייקט ע"י LINQ2XML הרבה יותר נוח.

בכל מקרה פוסט טוב.

# June 8, 2010 8:58 AM

דנה כתב/ה:

אני משתמשת ב

string res = webClient.DownloadString(url

לצורך אחר משערי מטבע

הבעיה שהעברית יוצאת כגיבריש

יש למישהו רעיון לפיתרון?

# July 27, 2010 4:50 AM

דנה כתב/ה:

מצאתי פתרון:

GetEncoding("windows-1255")

# July 27, 2010 1:26 PM
שלח תגובה

(שדה חובה)  

(שדה חובה)  

(אופציונלי)

(שדה חובה) 

Please add 7 and 3 and type the answer here:


Enter the numbers above: