Προς το περιεχόμενο

Αμεση Βοήθεια σε C me XML and Access


vtsafantakis

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα παιδία, για ακόμα μια φορά θα χρειαστώ την βοήθεια σας,

 

πρεπει να φτιαξω ενα προγραμμα σε c h c++ το οποιο να διαβάζει χml αρχεια και να τα τροποποιει. Δηλαδή, οταν ενα tag με το ονομα <telephono> ... </telephono> εχει την τιμή 2106782453 κατα την τροποποίηση το τελικο αρχειο xml να ειναι +30 2106782453. Αυτο θα γίνεται μονο όταν μια html φορμα καλεί το εν λόγο πρόγραμμα. Επίσης οταν θα γίνει αυτή η διαδικασία θα πρέπει να αποθηκεύεται σε μία βάση access και να στέλνει ενα μήνυμα στην html φορμα οτι η αποθήκευση έχει γίνει κανονικά.

 

 

Οποιαδήποτε βοήθεια είναι δεκτή.

  • 2 εβδομάδες αργότερα...
Δημοσ.
Καλησπέρα παιδία, για ακόμα μια φορά θα χρειαστώ την βοήθεια σας,

 

πρεπει να φτιαξω ενα προγραμμα σε c h c++ το οποιο να διαβάζει χml αρχεια και να τα τροποποιει. Δηλαδή, οταν ενα tag με το ονομα <telephono> ... </telephono> εχει την τιμή 2106782453 κατα την τροποποίηση το τελικο αρχειο xml να ειναι +30 2106782453. Αυτο θα γίνεται μονο όταν μια html φορμα καλεί το εν λόγο πρόγραμμα. Επίσης οταν θα γίνει αυτή η διαδικασία θα πρέπει να αποθηκεύεται σε μία βάση access και να στέλνει ενα μήνυμα στην html φορμα οτι η αποθήκευση έχει γίνει κανονικά.

 

 

Οποιαδήποτε βοήθεια είναι δεκτή.

 

 

 

ρε παιδια καμια βοήθεια ??

Δημοσ.

που ακριβώς είναι το προβλημά σου;;;επίσης, γιατι αυτή η επιλογή των γλωσσών;;;

Δημοσ.

ΑΝΟΙΞΕ ΑΡΧΕΙΟ 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_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 ή άλλες αβλεψίες.

 

Καλή τύχη!

Δημοσ.

φιλε σε ευχαριστώ πάρα πολύ... αν και δεν βλεπω να μου πεταει πολλα λάθη ο κώδικας. .. αν μπορεισ να με βοηθήσεις και σε κάτι άλλο. πώς μπορώ μέσο php να μετατρέπω τα αρχεια xml..

 

 

-----Προστέθηκε 12/1/2009 στις 01 : 46 : 35-----

 

 

wwwwwwwwwww qwwwww

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...