Chào các bạn. chắc là về XML công phu của nó như thế nào anh em cũng đã biết rồi nhỉ.[IMG]images/smilies/smile.png[/IMG] trong khi làm bài tập mình có lên codeproject search được cái "bảo bối" này, nay mình đưa lên đây cho anh em cùng nghiên cứu.[IMG]images/smilies/biggrin.png[/IMG]

trên trang codeproject tác giả bài viết cũng đã giới thiệu và nói về nó rồi. nhưng ở đây mình xin "phụ đề" bằng tiếng Việt.


khi bạn cần xuất dữ liệu ra dưới định dạng XML. vì trong VC++(bản 6) nó không hỗ trợ mình cách đọc và ghi XML vậy khi chúng ta cần phát triển sản phẩm của mình có xuất ra XML thì cần phải làm thế nào nếu chúng ta phát triển chúng trên VC6.
có 2 cách là viết một class tạo ra file XML theo chuẩn.
cách 2: chuyển qua phát triển trên các môi trường có hỗ trợ XML.

cách 1 thì đã có một "giang hồ" trên codeproject đã làm cho chúng ta.
kiến trúc của class cũng khá đơn giản. nó chỉ đơn thuần là việc ghi file theo đúng chuẩn của XML và tạo ra một cấu trúc dữ liệu file XML.[IMG]images/smilies/biggrin.png[/IMG]



ở đây zkday để dễ dàng demo zkday xin dùng luôn phần trong bài tập của mình để nói và làm code ví dụ luôn.

Mình sẽ tạo ra thêm 1 hàm là WriteXMLTag với code như sau:


Mã:
/* *  Ham ghi ra mot tag cua XML */ void WriteXMLTag(CXMLElement *xmlElementParrent,//tag cha  của tag cần ghi                 CString sTagValue, // tên tag cần ghi                 CString sText) // text của tag vd: <sTagValue>sText</sTagValue>{    CXMLElement *xmlElementTag;    CXMLElement *xmlElementText;     xmlElementText = new CXMLElement();    xmlElementTag = new CXMLElement();    xmlElementText->Create(sText.GetBuffer(1) ,XET_TEXT); // ghi kieu la TEXT    xmlElementTag->Create(sTagValue.GetBuffer(1),XET_TAG); // Ghi kieu la Tag     xmlElementTag->AppendChild(xmlElementText);    xmlElementParrent->AppendChild(xmlElementTag);}
đây là đoạn code sẽ convert dữ liệu từ file dbf phiên bản 3 sang file XML.


Mã:
/* *  Ham ghi cac truong cua du lieu xuong file XML */BOOL SaveFileXML(CString sFileName, CDBFile *dbFile){        CXMLFile xmlFile;        CXMLElement *xmlElement1, *xmlElementRoot;     xmlElement1 = new CXMLElement;    xmlElementRoot = new CXMLElement;     xmlFile.SetRoot(xmlElementRoot);    //tao tag root cho cua file XML    xmlElement1->Create("DataBaseFile",XET_TAG); // tag nay co ten la DatabaseFile    xmlElementRoot->AppendChild(xmlElement1); // set tag nay la tag con cua root        //tao tag Header    CXMLElement *pXmlElementTag;        pXmlElementTag = new CXMLElement();    pXmlElementTag->Create("Header",XET_TAG);       xmlElement1->AppendChild(pXmlElementTag);//tag header la tag con cua tag DatabaseFile    //tao tag HeaderField    CXMLElement *pXmlElementField;    pXmlElementField = new CXMLElement;    pXmlElementField->Create("HeaderFields",XET_TAG);    xmlElement1->AppendChild(pXmlElementField);    //tao tag Record    CXMLElement *pXmlElementRecords;    pXmlElementRecords = new CXMLElement;    pXmlElementRecords->Create("Records",XET_TAG);    xmlElement1->AppendChild(pXmlElementRecords);          /************************************************************************/    /* Phan ghi Header cua database file                                    */    /************************************************************************/    CString arrStrHeader[12];    dbFile->HeaderMainToString(arrStrHeader);    //ghi tag Head         //ghi cac tag la con cua tag head       WriteXMLTag(pXmlElementTag,CString("Virsion"),arrStrHeader[0]);    WriteXMLTag(pXmlElementTag,CString("LastUpdate"),arrStrHeader[1]);    WriteXMLTag(pXmlElementTag,CString("NumberRecord"),arrStrHeader[2]);    WriteXMLTag(pXmlElementTag,CString("HeaderLength"),arrStrHeader[3]);    WriteXMLTag(pXmlElementTag,CString("RecordLength"),arrStrHeader[4]);        WriteXMLTag(pXmlElementTag,CString("Reservode1"),arrStrHeader[5]);    WriteXMLTag(pXmlElementTag,CString("dBaseTranFlag"),arrStrHeader[6]);    WriteXMLTag(pXmlElementTag,CString("EnCryptFlag"),arrStrHeader[7]);    WriteXMLTag(pXmlElementTag,CString("dBaseMultiUser"),arrStrHeader[8]);    WriteXMLTag(pXmlElementTag,CString("Indexed"),arrStrHeader[9]);    WriteXMLTag(pXmlElementTag,CString("dbLangID"),arrStrHeader[10]);    WriteXMLTag(pXmlElementTag,CString("Reservide2"),arrStrHeader[11]);      /************************************************************************ /    /*  //phan ghi Fieldhead cua database                                   * /    / ************************************************************************/        CArray<CString,CString&> arrField;    arrField.SetSize(1);    dbFile->FieldHeaderToString(arrField);    int nCountField = 1;     for(int i=0; i<dbFile->GetnField(); i++)    {        CXMLElement *xmlElementFieldi;        xmlElementFieldi = new CXMLElement;        CString s;        s.Format("HeaderField",i+1);        xmlElementFieldi->Create(s.GetBuffer(1),XET_TAG);        pXmlElementField->AppendChild(xmlElementFieldi);        //ghi cac thuoc tinh cua no        WriteXMLTag(xmlElementFieldi,CString("FieldName"),arrField.GetAt(nCountField++));        WriteXMLTag(xmlElementFieldi,CString("FieldType"),arrField.GetAt(nCountField++));        WriteXMLTag(xmlElementFieldi,CString("FieldLength"),arrField.GetAt(nCountField++));    }         /************************************************************************/    /*  //phan ghi dataRecord cua database                                  */    /************************************************************************/      CArray<CString,CString&> sDataRecord;    sDataRecord.Copy(dbFile->sDataRecord);     int nCount = 0,nRecord = dbFile->GetnRecord();    int iCount = 0;    while (nCount < nRecord)     {        //tao tag Record thu i              CXMLElement *pXmlElementRecord;        pXmlElementRecord = new CXMLElement;        pXmlElementRecord->Create("Record",XET_TAG);        pXmlElementRecords->AppendChild(pXmlElementRecord);         nCountField = 1;         for(int i=0; i< dbFile->GetnField(); i++)        {            WriteXMLTag(pXmlElementRecord,arrField.GetAt(nCountField),sDataRecord.GetAt(iCount++));            nCountField+=3;        }        nCount ++;    }      xmlFile.SaveToFile(sFileName.GetBuffer(1)); // sau khi ghi xong chúng ta lưu file này lại.    return true;}
đây là dữ liệu:


đây là kết quảđọc file = IE6 cho nó chắc [IMG]images/smilies/biggrin.png[/IMG])



Mã:
http://www.codeproject.com/KB/XML/CXMLFile.aspx