XML-Datei auslesen und als String in Textfile schreiben
-
Hallo zusammen,
vielleicht bin ich hier falsch, dann bitte verschieben... und bitte... ich bin blutiger Anfänger in C.
Das Ganze spielt sich auf einem PNA ab mit CE 5.0
Also folgendes Problem:
Ich möchte gerne aus einer Datei bestimmte Einträge auslesen und als String in ein Textfile schreiben, was später dann als string ausgelesen wird.
Die Datei heisst feature.xml
Der Inhalt incl. der auszulesenden Zeile (ist nur eine Zeile, die benötigt wird) sieht so aus:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE FeatureLicense SYSTEM "feature.dtd"> <FeatureLicense vendor="MEDION" appVersion="5.0" appName="GoPal Navigator" editionName="AE" master="yes" version="1.0" >
Aus der letzten Zeile benötige ich folgende Einträge:
5.0
AEDas Ganze wird dann als "5.0 AE" in das textfile geschrieben mit noch weiteren Einträgen:
snip... . . . snap... HANDLE hFile = CreateFile(L"\\Windows\\WisGPS200.exe\0", GENERIC_READ , FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile != INVALID_HANDLE_VALUE) { wcscpy(variable, L"Atlas|"); } else { wcscpy(variable, L"Sirf|"); } CloseHandle(hFile); snip... . . . snap src = _wfopen(L"\\Temp\\hardware.txt", L"a+"); fclose(src);
Meine Frage nun:
Wie kann ich die Teilbereiche aus der XML-Datei auslesen und über fputws(variable, src); in die hardware.txt schreiben???
Ich steh da voll auf dem Schlauch... Kann mir da jemand helfen bitte?
Gruß
Pitter
-
Was machst du mit dem ganzen wchar_t Kraut?
Für nen gewöhlichen ASCII String kannst du dir eine Testzeile schreiben:char* zeile = "<FeatureLicense vendor=\"MEDION\" appVersion=\"5.0\" appName=\"GoPal Navigator\" editionName=\"AE\" master=\"yes\" version=\"1.0\" >";
Mit deren Hilfe du eine Filterfunktion schreibst:
char* a = zeile; while( *a != 0 ) { // TODO ... a++; }
Gruß,
B.B.
-
Hallo BB,
erst mal Danke für Deine Antwort.
Problem ist, dass ich das in das komplette Script einbauen muss, weil da noch ein paar andere REG-Einträge und Dateigrössen ermittelt werden, die mit in der hardware.txt drin stehen.
Der Inhalt der derzeitigen TXT ist:
Sirf|-|-|4920320|E323X|storage|635011072|320|240
...und da wollte ich dann noch 5.0 AE dazu bekommen... Ich krieg das jedenfalls so nicht hin.
Gruß
Pitter
-
Sieh dir mal flex an. Das baut dir aus ein paar regulären Ausdrücken ein C-Programm.
-
Hallo,
ich stricke das mit PellesC für die PNAs mit CE5.0.
Wie gesagt... Die Exe rennt ja, allerdings ohne meine zusätzlichen Inhalte.
Bin wohl zu doof dafür. Ob das hilft, jetzt umzuschwenken auf eine andere Software???Gruß
Pitter
-
Das ist keine andere Software in dem Sinne. Sieh es als kleines Hilfsmittel was für dich das C-Programm schreibt. Aber wahrscheinlich ist das zu kompliziert.
Mit char *strstr(const char *zuDurchsuchenderString, const char *zuSuchenderString) kannst du nach einem String suchen.
Du ließt die Datei ein, schreibst die in einen char *buffer, benutzt strstr um appVersion=" zu finden, ließt die folgende Nummer bis zum ", benutzt wieder strstr um editionName=" zu finden und ließt wieder den Namen bis zum " ein.
Als "blutiger C-Anfänger" wirst du wohl mehr Hilfe brauchen ...
Hier ein bisschen Code als Hilfestellung:
char *readFile(const char *filename){ //code heavily changed from http://www.cplusplus.com/reference/clibrary/cstdio/fread/ FILE *file = fopen(filename, "rb"); if (!file) return 0; //get file size fseek(file, 0, SEEK_END); size_t filesize = ftell(file); //files >4GB? rewind(file); //get memory to contain the whole file char *buffer = (char*)malloc(filesize+1); if (!buffer) return 0; //read file size_t temp; if ((temp=fread(buffer, 1, filesize+1, file))!=filesize){ free(buffer); fclose(file); return 0; } //clean up fclose(file); buffer[filesize] = '\0'; return buffer; } int main(){ char *buffer = readFile("feature.xml"); if (!buffer) exit(-1); //konnte feature.xml nicht lesen! char *position = strstr(buffer, "appVersion=\""); int appVersionLength; char *temp = position+sizeof("appVersion=\""); for (appVersionLength=0; *temp!='"'; temp++) appVersionLength++; char *appVersion = (char *)malloc(appVersionLength+1); strncpy(appVersion, position+sizeof("appVersion=\"", appVersionLength); printf("appVersion %s gefunden!", appVersion); //auf dieselbe art editionName lesen free(buffer); File *f = fopen("textfilemitweitereneinträgen", "a"); if (!f) exit(-1) //konnte datei nicht öffnen fprintf(f, " %s %s", appVersion, editionName); fclose(f); free(appVersion); free(editionName); return 0; }
Nicht perfekt, sollte dir aber genug Ideen geben um es hinzukriegen.
-
Hallo nwp2,
herzlichen dank für Deine Hilfe,
das werde ich heute Abend mal in Ruhe angehen. Merci!
:xmas1:
Bsher hab ich nur kleine Projekte in C gemacht, die aus wenigen Zeilen bestanden, wie REG-Werte auslesen, Dateigrössen ermitteln, externe Programme kontrolliert starten usw....
Aber hier an dem Ding hab ich mir schon die Ohren gebrochen...
Gruß
Pitter
-
Das krieg ich nicht hin...
Die Exe läuft durch, schreibt auch alle Einträge, liest aber anscheinend die XML nicht ein, da ich nur ein |- in der Textdatei stehen habe... Kann sich mal bitte einer ansehen, wo das da klemmt???
#include <windows.h> #include <windowsx.h> #include "main.h" #include <stdio.h> #include <stdlib.h> #include <tchar.h> #include <winioctl.h> #include <string.h> static HANDLE ghInstance; wchar_t variable[200]; FILE* src; HKEY hkey; DWORD dwValue; DWORD dwType; DWORD dwCount = sizeof ( DWORD ); #define MulDiv(a,b,c) (((a)*(b))/(c)) HBITMAP hbit; HFONT BuildFont(LPCTSTR pszFontFace, int nFontSize, BOOL fBold) { HDC hDC; int nHeight; LOGFONT lgf; hDC = GetDC(NULL); nHeight = -MulDiv(nFontSize, GetDeviceCaps(hDC, LOGPIXELSY), 72); ReleaseDC(NULL, hDC); memset(&lgf, 0, sizeof(lgf)); lgf.lfHeight = nHeight; lgf.lfWeight = fBold ? FW_BOLD: FW_NORMAL; lgf.lfCharSet = DEFAULT_CHARSET; lgf.lfOutPrecision = OUT_DEFAULT_PRECIS; lgf.lfClipPrecision = CLIP_DEFAULT_PRECIS; lgf.lfQuality = DEFAULT_QUALITY; lgf.lfPitchAndFamily = DEFAULT_PITCH; wcscpy(lgf.lfFaceName, pszFontFace); return CreateFontIndirect(&lgf); } int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpszCmdLine, int nCmdShow) { // delete old hardware.txt DeleteFile(L"\\Temp\\hardware.txt"); // create W'indow####################################### WNDCLASS wc; ghInstance = hInstance; // Get system dialog information. if (!GetClassInfo(NULL, L"Dialog", &wc)) return 0; // Register our own dialog. wc.hInstance = hInstance; wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDR_ICO_MAIN)); wc.lpszClassName = L"PCinstall"; if (!RegisterClass(&wc)) return 0; hbit = LoadBitmap(hInstance, MAKEINTRESOURCE(IDR_BMP_LOGO)); HWND hWnd; hWnd = CreateWindow(L"PCinstall", // Window Class Name L"Dialog", // The title bar text WS_VISIBLE | SS_BITMAP, // Only need to make the window // visible in CE 0, // Don't bother with size 0, // as palm apps fill the CW_USEDEFAULT, // whole screen CW_USEDEFAULT, NULL, // No parent (Top Level) NULL, // No Menu hInstance, NULL); ShowWindow (hWnd, nCmdShow); UpdateWindow (hWnd); HWND imgCtrl = CreateWindow( _T("STATIC"), NULL, SS_CENTERIMAGE | SS_BITMAP | WS_CHILD | WS_VISIBLE, 0, 0 , 480, 90, hWnd, NULL, NULL, NULL); SendMessage(imgCtrl,STM_SETIMAGE, (WPARAM)IMAGE_BITMAP,(LPARAM)hbit); HFONT hFont = BuildFont(TEXT("Tahoma"), 20, TRUE); HWND hwnd2 = CreateWindow( _T("STATIC"), _T("HARDWAREERKENNUNG LÄUFT"), WS_CHILD | WS_VISIBLE | SS_CENTER, 10, 130 , 460, 60, hWnd, NULL, NULL, NULL); SendMessage (hwnd2, WM_SETFONT, (WPARAM)hFont, TRUE); HWND hwnd3 = CreateWindow( _T("STATIC"), _T("PNA NICHT AUSSCHALTEN!."), WS_CHILD | WS_VISIBLE | SS_CENTER, 10, 200 , 460, 60, hWnd, NULL, NULL, NULL); SendMessage (hwnd3, WM_SETFONT, (WPARAM)hFont, TRUE); UpdateWindow (hWnd); _sleep(2); //Sirf //Atlas ############################################################### HANDLE hFile = CreateFile(L"\\Windows\\WisGPS200.exe\0", GENERIC_READ , FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile != INVALID_HANDLE_VALUE) { wcscpy(variable, L"Atlas|"); } else { wcscpy(variable, L"Sirf|"); } CloseHandle(hFile); //PoiObs installed?################################################# HANDLE hFile1 = CreateFile(L"\\My Flash Disk\\Navigation\\POIObserver\\POIObserver.exe\0", GENERIC_READ , FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); HANDLE hFile2 = CreateFile(L"\\Storage Card\\POIObserver\\POIObserver.exe\0", GENERIC_READ , FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile1 != INVALID_HANDLE_VALUE && hFile2 != INVALID_HANDLE_VALUE) wcscat(variable, L"mfd|sd|"); else if (hFile1 != INVALID_HANDLE_VALUE && hFile2 == INVALID_HANDLE_VALUE ) wcscat(variable, L"mfd|-|"); else if (hFile1 == INVALID_HANDLE_VALUE && hFile2 != INVALID_HANDLE_VALUE) wcscat(variable, L"-|sd|"); else { wcscat(variable, L"-|-|"); } CloseHandle(hFile1); CloseHandle(hFile2); // read size of pathfinder.dll####################################################### HANDLE hFile5 = CreateFile( TEXT("\\My Flash Disk\\Navigation\\PathfinderApp.dll\0"), GENERIC_READ , FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile5 == INVALID_HANDLE_VALUE) { wcscat(variable, L"-"); wcscat(variable, L"|"); } else { wchar_t hStr[100]; DWORD dwFileSize = GetFileSize(hFile5, NULL); CloseHandle(hFile); swprintf(hStr, L"%d", dwFileSize); wcscat(variable, hStr); wcscat(variable, L"|"); } CloseHandle(hFile5); // look for PNA-Version and pick out new PNA ###################################################### DWORD dwType = REG_SZ; wchar_t hStr1[100]; wchar_t hStr4[100]; DWORD dwDataSize = sizeof(hStr1); DWORD dwDataSize4 = sizeof(hStr4); wchar_t *p; RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Ident", 0, KEY_READ, &hkey); RegQueryValueEx ( hkey, (LPTSTR)L"OrigName", NULL, &dwType, (LPBYTE)hStr1, &dwDataSize ); RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"GoPal", 0, KEY_READ, &hkey); RegQueryValueEx ( hkey, (LPTSTR)L"GPSPort", NULL, &dwType, (LPBYTE)hStr4, &dwDataSize4 ); p = wcsstr(hStr4, L"VSPD"); if (p == NULL) { wcscat(variable, L"NO"); } else { wcscat(variable, hStr1); } wcscat(variable, L"|"); RegCloseKey(hkey); //test if SD-Card inserted############################################ if (CreateDirectory(L"\\Storage Card\\test-io", NULL)) {wcscat(variable, L"storage|");} else { wcscat(variable, L"-|"); } RemoveDirectory(L"\\Storage Card\\test-io"); //Test Free space on SD-Card#################################### PULARGE_INTEGER freespace = 0; wchar_t hStr5[100]; GetDiskFreeSpaceEx(L"\\Storage Card\\" , NULL, NULL, (PULARGE_INTEGER)&freespace); swprintf(hStr5, L"%d", freespace); wcscat(variable, hStr5); wcscat(variable, L"|"); //Get screenresolution####################################### wchar_t hStr2[100]; swprintf(hStr2, L"%d", GetSystemMetrics(SM_CXSCREEN)); wcscat(variable, hStr2); wcscat(variable, L"|"); wchar_t hStr3[100]; swprintf(hStr3, L"%d", GetSystemMetrics(SM_CYSCREEN)); wcscat(variable, hStr3); wcscat(variable, L"|"); //get software-version ME/AE############################### HANDLE hFile6 = CreateFile(TEXT("\\My Flash Disk\\navigation\\licenses\feature.xml\0"), GENERIC_READ , FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile6 == INVALID_HANDLE_VALUE) { wcscat(variable, L"-"); } else { // open file in buffer char *readFile(const char *filename); //code heavily changed from http://www.cplusplus.com/reference/clibrary/cstdio/fread/ FILE *file = fopen("\\My Flash Disk\\navigation\\licenses\feature.xml", "rb"); if (!file) return 0; //get file size fseek(file, 0, SEEK_END); size_t filesize = ftell(file); //files >4GB? rewind(file); //get memory to contain the whole file char *buffer = (char*)malloc(filesize+1); if (!buffer) return 0; //read file size_t temp; if ((temp=fread(buffer, 1, filesize+1, file))!=filesize){ free(buffer); fclose(file); return 0; } //look for entries in buffer int main(); wchar_t hStr6[100]; wchar_t hStr7[100]; if (!buffer) exit(-1); //konnte feature.xml nicht lesen! char *position = strstr(buffer, "appVersion=\""); int appVersionLength; char *temp1 = position+sizeof("appVersion=\""); for (appVersionLength=0; *temp1!='"'; temp++) appVersionLength++; char *appVersion = (char *)malloc(appVersionLength+1); strncpy(appVersion, position+sizeof "appVersion=\"", appVersionLength); swprintf(hStr7, L"%d", appVersion); wcscat(variable, hStr7); int editionNameLength; char *temp2 = position+sizeof("editionName=\""); for (editionNameLength=0; *temp2!='"'; temp++) editionNameLength++; char *editionName = (char *)malloc(editionNameLength+1); strncpy(editionName, position+sizeof "editionName=\"", editionNameLength); swprintf(hStr6, L"%d", editionName); wcscat(variable, hStr6); free(appVersion); free(editionName); } CloseHandle(hFile6); //Write vars to file#################################### src = _wfopen(L"\\Temp\\hardware.txt", L"a+"); fputws(variable, src); fclose(src); Sleep(3000); return 0; }
Gruß
Pitter