TinyXML2 jak na extrahování tabulky – XML / XSL(T) – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

TinyXML2 jak na extrahování tabulky – XML / XSL(T) – Fórum – Programujte.comTinyXML2 jak na extrahování tabulky – XML / XSL(T) – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
RoboHK0
Newbie
15. 7. 2017   #1
-
0
-

Mám program v C++, který ukládá výstup do souboru. Jedná se o několika tabulek a taky několik dalších dat. Jelikož má C++ v této oblasti velmi omezené možnosti, řešil jsem výstup jako Firebird embedded 2.5.2 databázový soubor. To proto, že program při zpracovávání dat pracuje právě s touto databází. Výhodu je komplexnost, etc... prostě má nesporné výhody. Má ale i nevýhody. Výstupní soubor, ač může být informačně třeba poměrně chudý (málo dat k uložení), má cca 900 kB. Další nevýhodou (co jsem četl) je, že fbclient (server) v programu - si vnitřně ukládá informace o každé vytvořené databázi - tím i výstupních souborech. Tím by časem mohl program (v závislosti na počtu vytvořených výstupních souborů) přerůst rozumné meze. Proto jsem se rozhodl výstupní soubor ukládat v jiném formátu a volba padla na TinyXML2. Vše potřebné uložit umím, horší je to s opětovným načtením z výstupního souboru do programu. Čísla a řetězce načíst umím, neumím tabulky. Mohl by mi prosím někdo poradit jak na to?

Nahlásit jako SPAM
IP: 89.176.206.–
gna
~ Anonymní uživatel
1891 příspěvků
15. 7. 2017   #2
-
0
-

   

int data[2][2] = { {1,2}, {3,4} };

XMLDocument doc;
XMLElement *table, *row, *cell;

table = doc.NewElement("tabulka");
doc.InsertFirstChild(table);

for (int r = 0; r < 2; r++) {
	row = doc.NewElement("radek");
	table->InsertEndChild(row);

	for (int c = 0; c < 2; c++) {
		cell = doc.NewElement("bunka");
		cell->SetText(data[r][c]);
		row->InsertEndChild(cell);
	}
}

doc.SaveFile("test.xml");

table = doc.FirstChildElement();
for (row = table->FirstChildElement(); row; row = row->NextSiblingElement()) {
	for (cell = row->FirstChildElement(); cell; cell = cell->NextSiblingElement())
		cout << cell->GetText() << " ";
	cout << endl;
}
<tabulka>
    <radek>
        <bunka>1</bunka>
        <bunka>2</bunka>
    </radek>
    <radek>
        <bunka>3</bunka>
        <bunka>4</bunka>
    </radek>
</tabulka>
Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
1891 příspěvků
15. 7. 2017   #3
-
0
-

Mimochodem Firebird nedrží celou databázi v paměti a už vůbec ne jakési výstupní soubory. I kdyby ano, tak nevím, jak ti od toho pomůže import/export XML, (které stejně při velkém počtu záznamů bude větší), když nakonec pořád pracuješ s tou databází.

Jako přenositelný formát fajn, cokoliv jiného je nesmysl.

Nahlásit jako SPAM
IP: 213.211.51.–
Kit+15
Guru
15. 7. 2017   #4
-
0
-

#3 gna
Někdy stačí pochopit strukturu dat a ejhle, v XML je z nepřehledné tabulky přehledný seznam. Názvy elementů "tabulka", "radek" a "bunka" je samozřejmě nutné zaměnit za sémantické značky.

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
RoboHK0
Newbie
15. 7. 2017   #5
-
0
-

Dík za odpovědi. Doteď mám výstupní soubor vytvořen jako novou databázi FB a to mi funguje skvěle. Jak jsem psal, těmi důvody byla velikost výst. souboru (víc jak 900 kB) a nárůst serveru (fakt jsem  o tom kdysi na nějakém fóru četl ). Podle těch příspěvků na fóru byl zřejmý závěr, že počtem vytvořených databází velikost serveru značně narůstá. Já ale server opravdu nepitval a ruku do ohně za to taky dát nemůžu... 
To vše mě lákalo nevytvářet výstupní soubor jako novou databázi, ale využít XML. Myslel jsem, že s tím objemem dat bych se mohl vejít do 100 kB. Faktem ale taky je, že tabulky které ukládám mají smíšený formát (int, double, stringy v jednom řádku). A tady je u TinyXML2 pro mě komplikace. Kdybych potřeboval ukládat jeden typ na jeden řádek, vystačím si s příkladem ze stránek TinyXML2 a použil bych pro uložení / načtení vector. Ale vše převádět na const char* by bylo značně frustrující. A tak mám dojem, že nebudu nic komplikovat a nechám to tak, jak to je. ještě jednou dík za názory.

Nahlásit jako SPAM
IP: 89.176.206.–
Kit+15
Guru
15. 7. 2017   #6
-
0
-

#5 RoboHK
Hlavní motivací by měla být přenositelnost dat. Když někomu pošleš databázi FB, tak ji zpravidla nebude schopen otevřít. XML se však dá otevřít téměř čímkoli, moderní jazyky mívají podporu pro XML již zabudovanou. S C++ je to sice obtížnější, ale také to půjde.

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
RoboHK0
Newbie
15. 7. 2017   #7
-
0
-

To je pravda. Já mám ale výstupy z programu 2:
1) výstupní sestava - přímo z programu - jako stránka html (tu předávám dál, např. pro tisk nebo ke zpracování do ms excel, pdf...)

2) soubor samotný (fb databáze), který si můžu kdykoliv načíst, upravit data, doplnit atd. a expedovat dle prvního bodu.

Nahlásit jako SPAM
IP: 89.176.206.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 1 host

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý