Hakkımda

Fotoğrafım
Dokuz Eylül Üniversitesi Bilgisayar Mühendisliği 4. Sınıf Öğrencisi.

23 Haziran 2009 Salı

XML Yönetim Sistemi

Artık blogumdan işinize yarayabileceği benimde zamanında çok araştırdığım konularla özellikle kodlama ile ilgili yazılarda paylaşmak istiyorum. XML ile ilgilenirken internette çok araştırdığım kaynağın az olduğunu düşündüğüm XML Validation konusuyla ilgili bir kod paylaşmak istiyorum. Bu konu ile ilgilenen arkadaşlara yardımcı olacağını düşünüyorum.

Bu çalışmada C, C++, ZORBA XQUERY,XERCES kullandım.

öncelikle eklenmesi gereken header dosyalarından başlamak istiyorum. Çünkü bunlar eklenmeden kod hiç birşekilde çalışmıyor.

#include iostream
#include sstream

#include stdlib.h
#include stdio.h
#include string.h

#include xercesc/util/PlatformUtils.hpp
#include xercesc/dom/deprecated/DOMParser.hpp
#include xercesc/framework/MemBufInputSource.hpp
#include xercesc/sax2/SAX2XMLReader.hpp
#include xercesc/sax2/XMLReaderFactory.hpp
#include xercesc/parsers/SAXParser.hpp
#include xercesc/util/OutOfMemoryException.hpp
#include "/usr/share/doc/libxerces-c2-dev/examples/StdInParse/StdInParseHandlers.hpp"

#include zorba/zorba.h
#include simplestore/simplestore.h
#include zorba/dynamic_context.h


bunun ardından yapılan çalışmayla ilgili küçük bir bilgi vermek istiyorum. Öncelikle bu uygulama birçok XML dosyasını tekbir txt dosyası gibi görmemizi sağlıyor. Bunun için öncelikle bir okuma yazma mekanizmasına ihtiyaç var. Daha sonra içerisinde birden fazla XML verisi olan txt dosyasından sorgulama yapabiliriz istediğimiz gibi. Tabi bu arada XML'lerin XSD ile uyumlu olması için bir Validation yapılması lazımki bu kısım gerçekten çok önemli.

Bu valiadation için önelikle txt dosyasına bir XSD dosyası kaydediyoruz. Burdan sonra XML dosyalarını txt dosyamıza ekliyoruz. Aşağıdaki kod gibi:

SXMS_Create("SXMS_File.txt","persons.xsd");

SXMS_Insert("SXMS_File.txt","persons1.xml");
SXMS_Insert("SXMS_File.txt","persons2.xml");
SXMS_Insert("SXMS_File.txt","note.xml");
SXMS_Insert("SXMS_File.txt","persons3.xml");
SXMS_Insert("SXMS_File.txt","persons4.xml");


Bu uygulamada sabit uzunluktaki dosyalarla ugrasmiyorduk. Tum XSD ve XML dosyalari farkli uzunluktalardi.
Benim bu dosyalarin uzunluklarini bilip ona gore hesaplamalar yapmam gerekeceginden benim bu uzunluklari hesaplayan bir fonksiyona ihtiyacim vardi.



long Calculate_File_Size(char * File_Name)

{

long count = 0;


FILE* fp;


fp = fopen( File_Name,"r+" );


while( !feof( fp ))
{


char count_variable;

fread(&count_variable,1,1, fp );

count++;


}


fclose(fp);



return count;



}



Bu uygulamada her txt dosyasinin (ben bir tane yarattim.) ilk yapisi xsd dosyasi olmali idi. FileHeader gibi de dusunulebilir.
Bu yuzden bu fonksiyonda oncelikle bu xsd dosyasi okunuyor, uzunlugu hesaplaniyor.

Daha sonra benim belirledigim bir txt dosyasina once boyutu sonra kendi icerigi olmak uzere yaziliyor.


void SXMS_Create(char * To_File_Name,char * From_File_Name)
{



//Bunu daha sonra validationda kullanmak adina tutuyorum.

XSD_FILE_NAME=From_File_Name;



//xsd dosyasi uzerinde uzunluk hesaplama ve okuma islemi gerceklesitiriliyor.

long size=Calculate_File_Size(From_File_Name);


FILE* fp;

fp=fopen(From_File_Name,"r+");


if (fp==NULL)

{


puts("Unable to create/open file...");
exit(1);



}


char* header_xsd = (char *)malloc(size);



fread(header_xsd,size,1,fp);



fclose(fp);


// Okunan xsd dosyasi txt dosyasina yaziliyor.

FILE* file1;


file1=fopen(To_File_Name,"w+");


if (file1==NULL)

{

puts("Unable to create/open file...");
exit(1);


}


fwrite(&size,sizeof(long),1,file1);

fwrite(header_xsd,size,1,file1);


fclose(file1);


printf("File %s inserted successfully to the %s File\n",From_File_Name,To_File_Name);




}



Bu uygulamada bir dosyada birden cok XML dosyasi olacak.
Ama bununda oncesinde her xml dosyasi XSD dosyasi ile uyumlu olacak. (VALIDATION)

Oncelikle belirlenen xml dosyasini uzunlugu hesaplanir ve icerigi okunur.

Daha sonra SXMS_Validate fonksiyonu cagirilarak XML dosyasinin XSD dosyasi ile uyumlulugu belirlenir.
Eger uyumlu ise txt dosyasina eklenir.
Uyumlu degilse ekrana mesaj dondurulur ve ekleme islemi gerceklestirilmez.


void SXMS_Insert(char * To_File_Name,char * From_File_Name)
{

// XML dosyasinin uzunlugu hesaplanir ve okunur.

long size=0;

size=Calculate_File_Size(From_File_Name);


FILE* file3;

file3=fopen(From_File_Name,"r+");


if (file3==NULL)

{
puts("Unable to create/open file...");
exit(1);

}


char* Xml=(char*)malloc(size);
fread(Xml,size,1, file3);




// Validation islemleri baslamistir artik.

try
{

XMLPlatformUtils::Initialize();

}


catch (const XMLException& toCatch)

{


XERCES_STD_QUALIFIER cerr << "Error during initialization! Message:\n"<< XERCES_STD_QUALIFIER endl;

return ;


}



// Validation fonksiyonu bool bir deger dondurmektedir.
// Eger basarili ise yani valid uyumlu ise true, uygun degilse false doner fonksiyondan.


bool control=SXMS_Validate(From_File_Name);


XMLPlatformUtils::Terminate();


fclose(file3);




//True ise xml xsd ile uyumludur demek ve artik txt dosyasina ekleme islemleri gerceklestirilebilir.

if(control==true)
{


printf("YOUR %s FILE IS VALID!\n",From_File_Name);

printf("I INSERT THIS XML TO %s!\n",To_File_Name);




// txt dosyamizin sonuna ekleniyor direkt olarak. Artik uyumluluguna eminiz.

FILE* file4;

file4=fopen(To_File_Name,"a+");

if (file4==NULL){

puts("Unable to create/open file...");
exit(1);

}



// Once boyutu sonra icerigi olacak sekilde yerlestiriliyor.

fwrite(&size,sizeof(long),1,file4);

record_counter++;

fwrite(Xml,size,1,file4);

fclose(file4);


}


// xml xsd ile uyumlu degilse ekrana bir mesaj cikiyor ve ekleme islemi gerceklestirilmiyor.

else
{



printf("YOUR %s FILE DOESN'T MATCH WITH XSD!\n",From_File_Name);

printf("I CAN'T INSERT THIS XML TO %s!\n",To_File_Name);



}



}



Bu uygulamada txtye eklenecek olan XML'lerin txtde bulunan XSD ile uyumlu olmasi istenmekteydi.
// Asagidaki fonksiyon bu uyumu denetlemektedir.
// Bunuda DOMParser ile yapmakta.

// parser.setExternalSchemaLocation("http://www.test.com persons.xsd"); satirinda bu XSD ile yapmakta kontrolu.

// Islemler yapildiginda hata sayisi (errorCount) sifir ise valide edilmis dogru,uyumlu dosyadir.
// Sonuc sifirdan farkli ise bir sekilde bir hata meydana gelmistir.
// Dosyalar birbirleriyle uyumlu degildir.

// Fonksiyon bool bir deger dondurdugunden, dosyalar uyumlu ise true, uyumlu degilse false doner.



/********************************************************************************************************************************************/



bool SXMS_Validate(char* filename)

{



printf("\n\n SXMS VALIDATION \n");
printf("--------------------------------------------\n");



long duration;
long errorCount;



// Bu kismida daha generic bir kod olmasi ve txt'nin icine yazilan XSD'den kontrol yapildigini garantilemek adina gerceklestirdim.
// Burasi parser.setExternalSchemaLocation icin gerekli



std::string location="http://www.test.com ";
location.append(XSD_FILE_NAME);


const char* schemaLocation=location.c_str ();



DOMParser parser;
parser.setValidationScheme(DOMParser::Val_Always);
parser.setDoSchema(true);
parser.setDoNamespaces(true);
parser.setExternalSchemaLocation(schemaLocation); //parser.setExternalSchemaLocation("http://www.test.com persons.xsd");


const unsigned long startMillis = XMLPlatformUtils::getCurrentMillis();

parser.parse(filename);

const unsigned long endMillis = XMLPlatformUtils::getCurrentMillis();
duration = endMillis - startMillis;
errorCount = parser.getErrorCount();


if(errorCount==0)
{

return true;

}


else
{

return false;

}



}


Umarım işinize yarar.


1 yorum:

alice dedi ki...

paylaşım için teşekkürler ellerine saglık