Odczyt z xml nbp zapis do zmiennych C++ OBIEKTOWO

0

Witam, pewnie mnie zlinczujecie zaraz ze ten temat byl miliard razy ale przeszukiwalem google itp i nie znalazlem dokladnego wyjasnienia jak przeniesc kod z xml na c++ otoz mam programik ktory przelicza pare walut z zl na inne ale ze stalymi wartosciami zadeklarowanymi wczesniej i teraz sie dowiedzialem ze musze zrobic tak zeby te dane byly pobierane z netu, np. xml nbp czytalem posty tutaj http://4programmers.net/Forum/viewtopic.php?id=93144

http://209.85.129.132/search?q=cache:IqgI4BeHM6UJ:4programmers.net/Forum/viewtopic.php%3Fid%3D149931+%22C%2B%2B%22+jak+pobiera%C4%87+kurs+walut&cd=11&hl=pl&ct=clnk&gl=pl

i na innych stronach ale kiepsko rozumialem te rzeczy, otoz zrobilem taki prosty programik

 
#include <iostream>
#include <conio.h>

using namespace std;

void wybor();                                                              
void pierwsza();
void druga();
void trzecia();

double euro, dolar, funt, zlote;
double przel_euro = 4.19;
double przel_funt = 4.67;
double przel_dol = 2.79;

int main()
{
cout << "Program przeliczajacy waluty.\n\n\n ";
     
char klawisz;                                                          
        do
        {
        wybor();
        cin >> klawisz;
        if (klawisz=='1') pierwsza();
        if (klawisz=='2') druga();
        if (klawisz=='3') trzecia();
        }while (klawisz!='4');
        cout << "Przycisnij dowolny klawisz aby zakonczyc";
             getch();
             return 0; 
             }
             
void wybor()
     {
     cout << " Wybor Waluty\n" <<  endl;
     cout << "[1] Zlote na dolary / Zlote to Dollars\n " << endl;
     cout << "[2] Zlote na euro / Zlote to Euro\n" << endl;
     cout << "[3] Zlote na Funty / Zlote to GBP \n" << endl;
     cout << "[4] Zakoncz\n" << endl;     
     cout << "Wpisz numer: "; 
     }


void pierwsza()
     {    
     cout << "Zlote na Dolary / Zlote to Dollars\n\n";                                            
     cout << "Wpisz ilosc zlotych / Inscribe how many zlote do u want to swap: ";
     cin >> zlote;
     cin.ignore();
   
     dolar = zlote * przel_dol;             
    
     cout << "\n" << zlote << " Zlotych to / Zlote that is " << dolar << " Dolarow / Dollars.\n\n\n\n";
     cout << endl;
     }
     
     void druga()
     {
     cout << "Zlote na Euro\n\n";
     cout << "Wpisz ilosc zlotych / Inscribe how many zlote do u want to swap: \n";
     cin >> zlote;
     cin.ignore();
   
     euro = zlote * przel_euro;
    
     cout << "\n" << zlote << " Zlotych to / Zlote that is " << euro << " Euro.\n" << endl;
     cout << endl;
     }
        
     void trzecia()
     {   
     cout << "Zlote na FUNTY\n\n";
     cout <<  "Wpisz ilosc zlotych: ";
     cin >> zlote;
     cin.ignore();
   
     funt = zlote * przel_funt;
   
     cout << "\n" << zlote << " Zlotych to / Zlote that is " << funt << " Funtow / GBP.\n\n\n";
     } 

i chcialbym teraz go tak zmodyfikowac zeby pobieral te zmienne kursu walut z xml nbp
http://www.nbp.pl/kursy/xml/a222z091113.xml

a nie wiem jak mam to zrobic i czy moglby jakis szanowny inz poradzic cos? moze jakis wzor podac jak

to sie zamienia bo nie mam nawet na czym sie oprzec zeby to zrobic z gory dzieki

0

To jest część mojej klasy do xml'a, razem z przykładem jak ściągnąć i przeglądać:

#include <msxml2.h>
#include <stdio.h>
#pragma comment(lib, "msxml2")

class XML
{
public:
	union {
		IXMLDOMDocument *m_doc;
		IXMLDOMNode     *m_node;
	};
	BSTR m_name, m_text, m_value;
	IXMLDOMNodeList *m_childs;

	XML();
	~XML();
	void ResetVariables();
	void Cleanup();
	BOOL InitNew();
	BOOL Open(LPWSTR path);
	BOOL AttachNode(IXMLDOMNode *node);
	BOOL GetNextNode(XML *node);
	BOOL GetFirstNode(XML *node);
	LPWSTR Name();
	LPWSTR Text();
	BOOL FindChild(LPWSTR name, BOOL fReset, XML *node);
	BOOL GetAttribute(LPWSTR pwszAttributeName, BSTR *ppv);
};

// zwraca kurs podanej waluty
BOOL GetPrice(XML *tabela, LPWSTR currency, float *pfKurs)
{
	XML waluta, kod, kurs;
	// waluta.m_node początkowo jest zerem
	while (tabela->FindChild(L"pozycja", !waluta.m_node, &waluta))
	{
		if (waluta.FindChild(L"kod_waluty", TRUE, &kod)
			&& !wcscmp(kod.Text(), currency)
			&& waluta.FindChild(L"kurs_sredni", TRUE, &kurs))
		{
			LPWSTR pwszKurs = kurs.Text();
			WCHAR *przecinek = wcschr(pwszKurs, ',');
			if (przecinek) *przecinek = '.';

			if (swscanf(pwszKurs, L"%f", pfKurs)) return TRUE;
		}
	}
	return FALSE;
}

int main()
{
	XML document, tabela, waluta, nazwa, kod, kurs;
	if (document.Open(L"http://www.nbp.pl/kursy/xml/a222z091113.xml"))
	//if (document.Open(L"a222z091113.xml"))
	{
		if (document.FindChild(L"tabela_kursow", TRUE, &tabela))
		{
			float euro;
			if (GetPrice(&tabela, L"EUR", &euro))
				wprintf(L"Kurs euro: %f\n\n", euro);

			while (tabela.FindChild(L"pozycja", !waluta.m_node, &waluta))
			{
				waluta.FindChild(L"nazwa_waluty", TRUE, &nazwa);
				waluta.FindChild(L"kod_waluty", TRUE, &kod);
				waluta.FindChild(L"kurs_sredni", TRUE, &kurs);

				LPWSTR pwszKurs = kurs.Text();
				WCHAR *przecinek = wcschr(pwszKurs, ',');
				if (przecinek) *przecinek = '.';

				float fKurs;
				if (swscanf(pwszKurs, L"%f", &fKurs))
				{
					wprintf(L"%.20s (%s) - %.4f PLN\n", nazwa.Text(), kod.Text(), fKurs);
				}
			}
		}
	}
}

XML::XML()
{
	CoInitialize(0);
	ResetVariables();
}

XML::~XML()
{
	Cleanup();
	CoUninitialize();
}

void XML::ResetVariables()
{
	m_doc    = 0;
	m_childs = 0;
	m_name   = 0;
	m_text   = 0;
	m_value  = 0;
}

void XML::Cleanup()
{
	if (m_doc) m_doc->Release();
	if (m_childs) m_childs->Release();
	if (m_name) SysFreeString(m_name);
	if (m_text) SysFreeString(m_text);
	if (m_value) SysFreeString(m_value);
	ResetVariables();
}

BOOL XML::GetFirstNode(XML *node)
{
	BOOL success = FALSE;

	if (m_childs) {
		m_childs->Release();
		m_childs = NULL;
	}

	if (m_doc && !m_doc->get_childNodes(&m_childs))
	{
		m_childs->reset();
		if (node) {
			success = GetNextNode(node);
		} else {
			success = TRUE;
		}
	}
	return success;
}

BOOL XML::InitNew()
{
	Cleanup();
	return (!CoCreateInstance(CLSID_DOMDocument30, NULL,
		CLSCTX_INPROC_SERVER, IID_IXMLDOMDocument, (void**)&m_doc));
}

BOOL XML::Open(LPWSTR path)
{
	VARIANT var;
	VARIANT_BOOL status;
	BOOL success = FALSE;
	if (InitNew())
	{
		m_doc->put_async(VARIANT_FALSE);
		m_doc->put_resolveExternals(VARIANT_FALSE);
		var.vt = VT_BSTR;
		var.bstrVal = SysAllocString(path);
		success = !m_doc->load(var, &status) && (status == VARIANT_TRUE);
		VariantClear(&var);
	}
	return success;
}

BOOL XML::AttachNode(IXMLDOMNode *node)
{
	Cleanup();
	return !node->QueryInterface(IID_IXMLDOMNode, (void**)&m_node);
}

BOOL XML::GetNextNode(XML *node)
{
	BOOL success = FALSE;
	if (m_childs)
	{
		IXMLDOMNode *domnode;
		if (!m_childs->nextNode(&domnode))
		{
			success = node->AttachNode(domnode);
			domnode->Release();
		}
		else
		{
			m_childs->Release();
			m_childs = NULL;
		}
	}
	return success;
}

LPWSTR XML::Name()
{
	if (m_name) SysFreeString(m_name);
	m_name = NULL;
	if (m_node && !m_node->get_nodeName(&m_name))
	{
		return m_name;
	}
	return L"";
}

LPWSTR XML::Text()
{
	if (m_text) SysFreeString(m_text);
	m_text = NULL;

	if (m_node && !m_node->get_text(&m_text))
	{
		return m_text;
	}
	return L"";
}

BOOL XML::FindChild(LPWSTR name, BOOL fReset, XML *node)
{
	BOOL success = FALSE;
	if (fReset)
	{
		GetFirstNode(NULL);
	}
	while (GetNextNode(node))
	{
		if (!_wcsicmp(node->Name(), name))
		{
			success = TRUE;
			break;
		}
	}
	return success;
}

BOOL XML::GetAttribute(LPWSTR pwszAttributeName, BSTR *ppv)
{
	BOOL success = FALSE;
	VARIANT vValue;

	if (m_node)
	{
		IXMLDOMNamedNodeMap *maps;
		if (!m_node->get_attributes(&maps))
		{
			BSTR bstrName = SysAllocString(pwszAttributeName);
			IXMLDOMNode *node;
			if (!maps->getNamedItem(bstrName, &node))
			{
				success = !node->get_nodeValue(&vValue);
				node->Release();
			}
			SysFreeString(bstrName);
			maps->Release();
		}
	}
	if (success)
	{
		if (!VariantChangeType(&vValue, &vValue, 0, VT_BSTR))
		{
			*ppv = vValue.bstrVal;
			success = (BOOL)vValue.bstrVal;
		}
		else
		{
			VariantClear(&vValue);
			success = FALSE;
		}
	}
	return success;
}

Edit: pod sam koniec kodu, gdy VariantChangeType nawali - w else, zabrakło wyzerowania zmiennej success.

0

wporzo wporzo ale nie uwierze, ze nie ma prostszego rozwiazania na ten problem %-)

0

moze jakies proste klasy ktore bylyby uzyteczne do tego programu macie jakies pomysly ?

        class Waluta {                                     
public:
       string nazwaWaluty;
       void wyswietlInfo();
       };

class Kurs : public Waluta {               //dziedziczy po wszystkich wlasciwosciach klasy
public:
       double kurs;
       void wyswietlInfo();
       };    

void Waluta::wyswietlInfo()                 
       {
       cout << "Waluta: " << this->nazwaWaluty << endl;

       }
void Kurs::wyswietlInfo()
     {
     Waluta::wyswietlInfo();
     cout << endl;
     cout << "Kurs Waluty " << this->kurs << endl;
     }

trywialne wiem ale nic innego wymyslec nie moge haha

0

Tamto tylko wyglada na skomplikowane, gdyz uzywa pod spodem biblioteki msxml - stad pare com'owych detali. Jesli je wyciac, to cala reszta to juz sa dosc proste pojedyncze operacje..

Oczywiscie to nie ruszy za chiny na linuksie, ale sadzac z conio.h, siedzisz na windzie i masz to w nosie.
Jesli chcesz innego podejscia, uzyj cURL do sciagania plikow i np. TinyXML czy heh Xerces do ich parsowania. Wierz mi, mniejsze pewnie nie bedzie:)

0

mialby ktos jakies pomysly na dalszy rozwoj tego programu?

0

co do bibliotek do obsługi XMLa to może warto użyć libxml i jego parsera
http://www.xmlsoft.org/

najprościej będzie chyba skorzystać z metody SAX (interpretuje XML jako strumień znaczników, działa dosyć szybko, stosuje się w prostych programach)

w google znajdziesz dużo informacji na ten temat;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1