vtsafantakis Δημοσ. 1 Ιανουαρίου 2009 Δημοσ. 1 Ιανουαρίου 2009 Καλησπέρα παιδία, για ακόμα μια φορά θα χρειαστώ την βοήθεια σας, πρεπει να φτιαξω ενα προγραμμα σε c h c++ το οποιο να διαβάζει χml αρχεια και να τα τροποποιει. Δηλαδή, οταν ενα tag με το ονομα <telephono> ... </telephono> εχει την τιμή 2106782453 κατα την τροποποίηση το τελικο αρχειο xml να ειναι +30 2106782453. Αυτο θα γίνεται μονο όταν μια html φορμα καλεί το εν λόγο πρόγραμμα. Επίσης οταν θα γίνει αυτή η διαδικασία θα πρέπει να αποθηκεύεται σε μία βάση access και να στέλνει ενα μήνυμα στην html φορμα οτι η αποθήκευση έχει γίνει κανονικά. Οποιαδήποτε βοήθεια είναι δεκτή.
vtsafantakis Δημοσ. 10 Ιανουαρίου 2009 Μέλος Δημοσ. 10 Ιανουαρίου 2009 Καλησπέρα παιδία, για ακόμα μια φορά θα χρειαστώ την βοήθεια σας, πρεπει να φτιαξω ενα προγραμμα σε c h c++ το οποιο να διαβάζει χml αρχεια και να τα τροποποιει. Δηλαδή, οταν ενα tag με το ονομα <telephono> ... </telephono> εχει την τιμή 2106782453 κατα την τροποποίηση το τελικο αρχειο xml να ειναι +30 2106782453. Αυτο θα γίνεται μονο όταν μια html φορμα καλεί το εν λόγο πρόγραμμα. Επίσης οταν θα γίνει αυτή η διαδικασία θα πρέπει να αποθηκεύεται σε μία βάση access και να στέλνει ενα μήνυμα στην html φορμα οτι η αποθήκευση έχει γίνει κανονικά. Οποιαδήποτε βοήθεια είναι δεκτή. ρε παιδια καμια βοήθεια ??
Dr.Fuzzy Δημοσ. 10 Ιανουαρίου 2009 Δημοσ. 10 Ιανουαρίου 2009 Για κανε post τον κωδικα που εχεις γραψει μεχρι στιγμης.
Επισκέπτης Δημοσ. 10 Ιανουαρίου 2009 Δημοσ. 10 Ιανουαρίου 2009 που ακριβώς είναι το προβλημά σου;;;επίσης, γιατι αυτή η επιλογή των γλωσσών;;;
vtsafantakis Δημοσ. 10 Ιανουαρίου 2009 Μέλος Δημοσ. 10 Ιανουαρίου 2009 ΑΝΟΙΞΕ ΑΡΧΕΙΟ XML_1Α ΓΙΑ ΑΝΑΓΝΩΣΗ ΑΝΟΙΞΕ ΑΡΧΕΙΟ XML_1Β ΓΙΑ ΓΡΑΦΗ WHILE NOT ΤΕΛΟΣ ΑΡΧΕΙΟΥ XML_1A DO ΔΙΑΒΑΣΕ ΜΙΑ ΓΡΑΜΜΗ IF TAG=“<AR_PARAGGELIAS>” THEN ΓΡΑΨΕ ΣΤΟ XML_1Β ΤΟ TAG ΓΡΑΨΕ ΣΤΟ XML_1Β ΤΗΝ ΤΙΜΗ ‘’Α0 ” ΓΡΑΨΕ ΣΤΟ XML_1Β ΤΗΝ ΑΡΧΙΚΗ ΤΙΜΗ ΓΡΑΨΕ ΣΤΟ XML_1Β ΤΟ TAG ΚΛΕΙΣΙΜΑΤΟΣ END ELSE IF TAG=”THLEFONO” THEN ΓΡΑΨΕ ΣΤΟ XML_1Β ΤΟ TAG ΓΡΑΨΕ ΣΤΟ XML_1Β ΤΗΝ ΤΙΜΗ ‘’0030 ” ΓΡΑΨΕ ΣΤΟ XML_1Β ΤΗΝ ΑΡΧΙΚΗ ΤΙΜΗ ΓΡΑΨΕ ΣΤΟ XML_1Β ΤΟ TAG ΚΛΕΙΣΙΜΑΤΟΣ END ELSE IF TAG= “POSOTHTA” THEN ΓΡΑΨΕ ΣΤΟ XML_1Β ΤΟ TAG ΓΡΑΨΕ ΣΤΟ XML_1Β ΤΗΝ ΑΡΧΙΚΗ ΤΙΜΗ ΓΡΑΨΕ ΣΤΟ XML_1Β ΤΗΝ ΤΙΜΗ “TEMAXIA” ΓΡΑΨΕ ΣΤΟ XML_1Β TAG ΚΛΕΙΣΙΜΑΤΟΣ END ELSE ΓΡΑΨΕ ΓΡΑΜΜΗ END END ΚΛΕΙΣΕ ΑΡΧΕΙΟ XML_1Α ΚΛΕΙΣΕ ΑΡΧΕΙΟ XML_1B σε ψευδοκώδηκα είναι αυτός.
Directx Δημοσ. 11 Ιανουαρίου 2009 Δημοσ. 11 Ιανουαρίου 2009 ΑΝΟΙΞΕ ΑΡΧΕΙΟ XML_1Α ΓΙΑ ΑΝΑΓΝΩΣΗΑΝΟΙΞΕ ΑΡΧΕΙΟ XML_1Β ΓΙΑ ΓΡΑΦΗ WHILE NOT ΤΕΛΟΣ ΑΡΧΕΙΟΥ XML_1A DO ΔΙΑΒΑΣΕ ΜΙΑ ΓΡΑΜΜΗ IF TAG=“<AR_PARAGGELIAS>” THEN ΓΡΑΨΕ ΣΤΟ XML_1Β ΤΟ TAG ΓΡΑΨΕ ΣΤΟ XML_1Β ΤΗΝ ΤΙΜΗ ‘’Α0 ” ΓΡΑΨΕ ΣΤΟ XML_1Β ΤΗΝ ΑΡΧΙΚΗ ΤΙΜΗ ΓΡΑΨΕ ΣΤΟ XML_1Β ΤΟ TAG ΚΛΕΙΣΙΜΑΤΟΣ END ELSE IF TAG=”THLEFONO” THEN ΓΡΑΨΕ ΣΤΟ XML_1Β ΤΟ TAG ΓΡΑΨΕ ΣΤΟ XML_1Β ΤΗΝ ΤΙΜΗ ‘’0030 ” ΓΡΑΨΕ ΣΤΟ XML_1Β ΤΗΝ ΑΡΧΙΚΗ ΤΙΜΗ ΓΡΑΨΕ ΣΤΟ XML_1Β ΤΟ TAG ΚΛΕΙΣΙΜΑΤΟΣ END ELSE IF TAG= “POSOTHTA” THEN ΓΡΑΨΕ ΣΤΟ XML_1Β ΤΟ TAG ΓΡΑΨΕ ΣΤΟ XML_1Β ΤΗΝ ΑΡΧΙΚΗ ΤΙΜΗ ΓΡΑΨΕ ΣΤΟ XML_1Β ΤΗΝ ΤΙΜΗ “TEMAXIA” ΓΡΑΨΕ ΣΤΟ XML_1Β TAG ΚΛΕΙΣΙΜΑΤΟΣ END ELSE ΓΡΑΨΕ ΓΡΑΜΜΗ END END ΚΛΕΙΣΕ ΑΡΧΕΙΟ XML_1Α ΚΛΕΙΣΕ ΑΡΧΕΙΟ XML_1B σε ψευδοκώδηκα είναι αυτός. Η καλύτερη λύση στο πρόβλημα σου είναι η χρήση κάποιου εξωτερικού XML Parser ο οποίος θα σου επιτρέψει εύκολα, γρήγορα και σίγουρα την διαχείριση του Document σου. Από εκεί και πέρα, σε γλώσσα C μπορείς να διαβάσεις κάθε γραμμή του XML αρχείου (fgets), ύστερα να εντοπίσεις την αρχή (<Αρχή>) και το τέλος (</Αρχή>) του tag που σε ενδιαφέρει (strstr) και τέλος να επιστρέψεις (strncpy) την τιμή που βρίσκεται μεταξύ αυτών των δυο σημείων ώστε να την τροποποιήσεις, πριν την γράψεις στο νέο αρχείο, όπως επιθυμείς (fprintf). Σε περίπτωση που δεν πρόκειται για γνωστό tag απλά γράφεις την γραμμή ως έχει στο νέο αρχείο (fputs). Ακολουθεί ένας πολύ απλός κώδικας σε ANSI-C που κάνει τα παραπάνω: > /*-Tag Value Replace Demo (c) directx----------------------------------------*/ #include <stdio.h> #include <string.h> #include <stdlib.h> #ifdef __BORLANDC__ #pragma hdrstop #endif /*---------------------------------------------------------------------------*/ char *_GetTagVal(char *pszLine, char *pszName, char *pszEnd); #ifdef __BORLANDC__ #pragma argsused #endif int main(int argc, char* argv[]) { FILE *fStreamA = NULL, *fStreamB = NULL; if((fStreamA = fopen("..\\IN.TXT", "r")) == NULL) printf(" Cannot open IN.XML\n"); else if((fStreamB = fopen("OUT.XML", "w")) != NULL) { char szLine[bUFSIZ]; /* BUFSIZ for Borland C = 512 bytes (enough?) */ /* Read each file line */ while(fgets(szLine, sizeof(szLine), fStreamA) != NULL) { char *pszTagValue, cWriteLine = 0; #ifdef _DEBUG_LINE printf("%s", szLine); #endif /* Find AR_PARAGGELIAS tag */ if((pszTagValue = _GetTagVal(szLine, "<AR_PARAGGELIAS>", "</AR_PARAGGELIAS>")) != NULL) { #ifdef _DEBUG putchar('A'); #endif /* Ignore empty Tag */ if(strlen(pszTagValue)) { cWriteLine = 1; /* Modify Tag Value */ fprintf(fStreamB, "<AR_PARAGGELIAS>A0%s</AR_PARAGGELIAS>\n", pszTagValue); } } free(pszTagValue); /* Find THLEFONO tag */ if((pszTagValue = _GetTagVal(szLine, "<THLEFONO>", "</THLEFONO>")) != NULL) { #ifdef _DEBUG putchar('T'); #endif /* Ignore empty Tag */ if(strlen(pszTagValue)) { cWriteLine = 1; /* Modify Tag Value */ fprintf(fStreamB, "<THLEFONO>0030%s</THLEFONO>\n", pszTagValue); } } free(pszTagValue); /* Find POSOTHTA tag */ if((pszTagValue = _GetTagVal(szLine, "<POSOTHTA>", "</POSOTHTA>")) != NULL) { #ifdef _DEBUG putchar('P'); #endif /* Ignore empty Tag */ if(strlen(pszTagValue)) { cWriteLine = 1; /* Modify Tag Value */ fprintf(fStreamB, "<POSOTHTA>%sTEMAXIA</POSOTHTA>\n", pszTagValue); } } free(pszTagValue); /* Write original data to fStreamB if cWriteLine == 0 */ if(!cWriteLine) if(fputs(szLine, fStreamB) == EOF) { printf(" I/O Error on OUT.XML!\n"); break; } } } else printf(" Cannot create OUT.XML\n"); #ifdef __BORLANDC__ fcloseall(); #else fclose(fStreamA); fclose(fStreamB); #endif printf("\nPress Enter to exit.."); getchar(); return 0; } /*---------------------------------------------------------------------------*/ char *_GetTagVal(char *pszLine, char *pszName, char *pszEnd) { /* * Return Tag Value, on error return NULL * * Warning: I assume simplified syntax: <TAG>Value</TAG>\n no <TAG></TAG(VALUE)></TAG(\n) etc.. */ char *pszOpenPos = strstr(pszLine, pszName), /* Find BeginTag */ *pszClosePos= strstr(pszLine, pszEnd), /* Find EndTag */ *pszData = NULL; int nOpenPos, nClosePos; /* Break if Begin and/or End tag is missing */ if(pszOpenPos == NULL || pszClosePos == NULL) return NULL; nOpenPos = (pszOpenPos - pszLine) + strlen(pszName); /* Find BeginTag end */ nClosePos= pszClosePos - pszLine; /* Find EndTag start */ /* Allocate enough memory to hold Tag Value, else break */ if((pszData = (char*)calloc(1, ((nClosePos - nOpenPos) + 1) * sizeof(char))) == NULL) return NULL; /* Copy Tag Value to newly allocated memory */ strncpy(pszData, &pszLine[nOpenPos], nClosePos - nOpenPos); /* Return memory & do not forget to free it!! */ return pszData; } Είσοδος: > <TEST ME> <AR_PARAGGELIAS>123456789</AR_PARAGGELIAS> <THLEFONO>2107777777</THLEFONO> <POSOTHTA>10</POSOTHTA> <DUMMY> </DUMMY> </TEST ME> Έξοδος: > <TEST ME> <AR_PARAGGELIAS>A0123456789</AR_PARAGGELIAS> <THLEFONO>00302107777777</THLEFONO> <POSOTHTA>10TEMAXIA</POSOTHTA> <DUMMY> </DUMMY> </TEST ME> Τώρα κατά πόσο δουλεύει σε κάθε περίπτωση XML, αυτό θα πρέπει να το βρεις μόνος σου και να τον τροποποιήσεις κατάλληλα όπου χρειασθεί –επαναλαμβάνω, καλύτερα να βασισθείς σε έναν εξωτερικό XML parser (ειδικά αν δεν πρόκειται για κάποια άσκηση ΑΕΙ/ΤΕΙ κτλ). Οι συγκρίσεις του κώδικα είναι case-sensitive, η μορφή των tag που σε ενδιαφέρει οφείλει να είναι “<TAG>Τιμή</TAG>\n”. Κάθε γραμμή δεν μπορεί να έχει παραπάνω από BUFSIZ (512) χαρακτήρες. Η εγγραφή των τροποποιημένων tag δεν σέβεται το φορμάρισμα που μπορεί να έχει το αρχείο (αυτό δεν είναι πρόβλημα για το XML specification) καθιστώντας το δυσανάγνωστο για τους ανθρώπους. Τα #ifdef αφορούν εντολές του compiler μου (μπορείς να τις ξεχάσεις). Φυσικά μπορεί να υπάρχουν bugs ή άλλες αβλεψίες. Καλή τύχη!
vtsafantakis Δημοσ. 11 Ιανουαρίου 2009 Μέλος Δημοσ. 11 Ιανουαρίου 2009 φιλε σε ευχαριστώ πάρα πολύ... αν και δεν βλεπω να μου πεταει πολλα λάθη ο κώδικας. .. αν μπορεισ να με βοηθήσεις και σε κάτι άλλο. πώς μπορώ μέσο php να μετατρέπω τα αρχεια xml.. -----Προστέθηκε 12/1/2009 στις 01 : 46 : 35----- wwwwwwwwwww qwwwww
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.