Here are some ideas and code examples telling how to export a recordset to XML in C++ with CMarkup. If you have a recordset object after running a database SQL query you can save the recordset as XML for logging, migration or later import.
This example uses a CVORecordset
which is the ADO on Windows CE (ADOCE) recordset for the Windows mobile platform. But most recordset classes for C++ have similar methods.
void ExportRecordsetToXML( CMarkup& xml, CVORecordset* pRecordset ) { // Create a table document (or subdocument) in xml xml.AddElem( "table" ); xml.IntoElem(); pRecordset->MoveFirst(); int nFieldCount = pRecordset->GetFieldCount(); while ( ! pRecordset->IsEOF() ) { // Create a record element for every record in the recordset xml.AddElem( "record" ); for ( int nField = 0; nField < nFieldCount; ++nField ) { // Get the value as a string and export with SetAttrib or AddChildElem CString strValue; pRecordset->GetFieldValue( nRecord, strValue ); xml.SetAttrib( pRecordset->GetFieldName(nField), strValue ); // xml.AddChildElem( pRecordset->GetFieldName(nField), strValue ); } pRecordset->MoveNext(); } xml.OutOfElem(); }
If you want to put each value in an element rather than an attribute, use the AddChildElem
function (shown in the remark) instead of the SetAttrib
method.
CMarkup xml; ExportRecordsetToXML( xml, &recordset ); xml.SetAttrib( "name", "users" ) xml.Save( "users.xml" );
ExportRecordsetToXML
returns with the table element at the main position so you can set the table name as an attribute of the table element:
<table name="users">
<record username="john" userid="2"/>
<record username="jane" userid="9"/>
</table>
Or if you want an HTML format.
<table>
<tr><td>john</td><td>2</td></tr>
<tr><td>jane</td><td>9</td></tr>
</table>
The following code to export a record keeps a row on one HTML line using the MNF_WITHNOLINES
flag.
xml.AddElem( "tr" ); for ( int nField = 0; nField < nFieldCount; ++nField ) { CString strValue; pRecordset->GetFieldValue( nRecord, strValue ); xml.AddChildElem( "td", strValue, MNF_WITHNOLINES ); }
The following function demonstrates how to generically export a table to XML file by just selecting all fields and rows from the given table name.
bool ExportTableToXML( CMarkup& xml, CString strTableName ) { CVORecordset recordset( theApp.m_Connection ); CString strQuery = "SELECT * from " + strTableName; recordset.Open( strQuery, adOpenForwardOnly, adLockReadOnly ); if ( recordset.IsOpen() ) { ExportRecordsetToXML( xml, &recordset ); xml.SetAttrib( "name", strTableName ); } recordset.Close(); }
The ExportTableToXML
function can be used to save multiple recordsets in an XML file.
CMarkup xml; ExportTableToXML( xml, "users" ); ExportTableToXML( xml, "events" ); xml.Save( "tables.xml" );
See also: