📄 markupdlg.cpp
字号:
Check( xml.SetDoc(
_T("<?xml version=\"1.0\" encoding=\"GB2312\"?>\n")
_T("<CHAR>\xD6\xD0\xB9\xFA\xC8\xCB</CHAR>")
) );
Check( xml.FindElem() );
Check( xml.GetData() == csSampleGB2312Chars );
Check( xml.SetAttrib(_T("v"),csSampleGB2312Chars) );
Check( xml.GetAttrib(_T("v")) == csSampleGB2312Chars );
#endif
// Empty Data Test
StartCheckZone( _T("Empty Data") );
xml.SetDoc( NULL );
Check( xml.AddElem(_T("A"),_T("data")) );
Check( xml.SetData(_T("")) );
Check( xml.AddChildElem(_T("B"),_T("data")) );
Check( xml.SetChildData(_T("")) );
Check( xml.IntoElem() );
Check( xml.IntoElem() );
Check( xml.AddElem(_T("C"),_T("data")) );
Check( xml.OutOfElem() );
Check( xml.OutOfElem() );
Check( xml.GetChildTagName() == _T("B") );
Check( xml.GetTagName() == _T("A") );
// Depth First Traversal Test, loop through all elements
StartCheckZone( _T("Depth First Traversal Test") );
xml.SetDoc( _T("<A><B><C/><C/><C><D/></C></B><B><C/></B></A>") );
CString csListOfTagNames;
BOOL bFinished = FALSE;
if ( xml.FindElem() )
csListOfTagNames = _CSTR(xml.GetTagName());
if ( ! xml.FindChildElem() )
bFinished = TRUE;
while ( ! bFinished )
{
// Process Element
xml.IntoElem();
csListOfTagNames += _CSTR(xml.GetTagName());
// Next element (depth first)
BOOL bFound = xml.FindChildElem();
while ( ! bFound && ! bFinished )
{
if ( xml.OutOfElem() )
bFound = xml.FindChildElem();
else
bFinished = TRUE;
}
}
Check( csListOfTagNames == _T("ABCCCDBC") );
// Depth First Traversal Test 2, include root in loop
StartCheckZone( _T("Depth First Traversal Test 2") );
csListOfTagNames.Empty();
bFinished = FALSE;
xml.ResetPos();
if ( ! xml.FindElem() )
bFinished = TRUE;
while ( ! bFinished )
{
// Process element
CString csTag = _CSTR(xml.GetTagName());
csListOfTagNames += csTag;
// Next element (depth first)
BOOL bFound = xml.FindChildElem();
while ( ! bFound && ! bFinished )
{
if ( xml.OutOfElem() )
bFound = xml.FindChildElem();
else
bFinished = TRUE;
}
if ( bFound )
xml.IntoElem();
}
Check( csListOfTagNames == _T("ABCCCDBC") );
// INI-Style Section Entry Test
StartCheckZone( _T("INI-Style Section Entry Test") );
CString csValue;
xml.SetDoc( NULL );
SetEntry( xml, _T("Settings"), _T("Count"), _T("10") );
SetEntry( xml, _T("Settings"), _T("User"), _T("John Smith") );
SetEntry( xml, _T("Files"), _T("Database"), _T("test1.txt") );
SetEntry( xml, _T("Files"), _T("Database"), _T("test2.txt") ); // overwrite
Check( FindEntry(xml,_T("Settings"),_T("Count"),csValue) );
Check( csValue == _T("10") );
Check( FindEntry(xml,_T("Files"),_T("Database"),csValue) );
Check( csValue == _T("test2.txt") );
// Load/Save Test
StartCheckZone( _T("Load/Save Test") );
CString csLSFilename = _T("CMarkupRunTest.xml");
BOOL bLSFileLoaded = xml.Load( csLSFilename );
if ( bLSFileLoaded )
{
// Load/Save
xml.FindElem();
Check( xml.Save(csLSFilename) );
Check( xml2.Load(csLSFilename) );
Check( xml2.FindElem() );
Check( xml2.GetTagName() == xml.GetTagName() );
}
else
m_csChecks += _T("File I/O tests skipped\r\n");
// Node Test, navigate/modify comments and other nodes
StartCheckZone( _T("Node Test") );
csPTDoc =
_T("<?xml version=\"1.0\"?>\n")
// To get MSXML to preserve whitespace in mixed content
// you can use a DTD and an xml:space attribute
// otherwise MSXML would not have a whitespace node between </B> <I>
// See "White Space Handling" in the XML Specification
// Also note the mixed content declaration of ITEM
_T("<!DOCTYPE PARSETEST [\n")
_T("<!ELEMENT PARSETEST (ITEM*)>\n")
_T("<!ATTLIST PARSETEST v CDATA '' s CDATA ''>\n")
_T("<!ELEMENT ITEM (#PCDATA|B|I)*>\n")
_T("<!ATTLIST ITEM note CDATA '' xml:space (default|preserve) 'preserve'>\n")
_T("<!ELEMENT B ANY>\n")
_T("<!ELEMENT I ANY>\n")
_T("]>\n")
_T("<!--tightcomment-->\n")
_T("<PARSETEST v=\"1\" s=\'6\'>\n")
_T("<!-- mid comment -->\n")
_T("<ITEM note=\"hi\"/>\n")
_T("<ITEM note=\"see data\">hi</ITEM>\n")
_T("<ITEM> mixed <B>content</B> <I>okay</I></ITEM>\n")
_T("</PARSETEST>\n")
_T("<!-- end comment -->\n")
;
Check( xml.SetDoc(csPTDoc) );
Check( xml.FindNode() == xml.MNT_PROCESSING_INSTRUCTION );
Check( xml.GetData() == _T("xml version=\"1.0\"") );
Check( xml.FindNode(xml.MNT_COMMENT) );
Check( xml.GetData() == _T("tightcomment") );
Check( xml.SetData( _T("comment 1 changed") ) );
Check( xml.GetData() == _T("comment 1 changed") );
Check( xml.FindNode(xml.MNT_EXCLUDE_WHITESPACE) == xml.MNT_ELEMENT );
Check( xml.GetTagName() == _T("PARSETEST") );
Check( xml.IntoElem() );
Check( xml.FindNode(xml.MNT_EXCLUDE_WHITESPACE) == xml.MNT_COMMENT );
Check( xml.GetData() == _T(" mid comment ") );
Check( xml.FindNode(xml.MNT_EXCLUDE_WHITESPACE) == xml.MNT_ELEMENT );
Check( xml.FindNode(xml.MNT_EXCLUDE_WHITESPACE) == xml.MNT_ELEMENT );
Check( xml.FindNode(xml.MNT_EXCLUDE_WHITESPACE) == xml.MNT_ELEMENT );
Check( xml.IntoElem() );
Check( xml.FindNode() == xml.MNT_TEXT );
Check( xml.GetData() == _T(" mixed ") );
Check( xml.FindNode() == xml.MNT_ELEMENT );
Check( xml.GetTagName() == _T("B") );
Check( xml.IntoElem() );
Check( xml.FindNode() == xml.MNT_TEXT );
Check( xml.GetData() == _T("content") );
Check( xml.FindNode() == 0 );
Check( xml.OutOfElem() );
Check( xml.FindNode() == xml.MNT_WHITESPACE );
Check( xml.GetData() == _T(" ") );
Check( xml.FindNode() == xml.MNT_ELEMENT );
Check( xml.GetTagName() == _T("I") );
Check( xml.IntoElem() );
Check( xml.FindNode() == xml.MNT_TEXT );
Check( xml.GetData() == _T("okay") );
Check( xml.FindNode() == 0 );
Check( xml.OutOfElem() );
Check( xml.FindNode() == 0 );
Check( xml.OutOfElem() );
// Create a document xml2 by copying all nodes of document xml
// Resulting document xml2 differs only by attributes and CRLF instead of just LF
xml2.SetDoc( NULL );
xml.ResetPos();
BOOL bBypassWhitespace = FALSE;
while ( 1 )
{
int nType = xml.FindNode();
if ( nType == 0 )
{
if ( ! xml.OutOfElem() )
break;
xml2.OutOfElem();
}
else
{
if ( bBypassWhitespace && nType == xml.MNT_WHITESPACE )
bBypassWhitespace = FALSE;
else
{
if ( nType == xml.MNT_ELEMENT )
{
xml2.AddNode( nType, _CSTR(xml.GetTagName()) );
xml.IntoElem();
xml2.IntoElem();
}
else
{
xml2.AddNode( nType, _CSTR(xml.GetData()) );
if ( nType & ( xml.MNT_PROCESSING_INSTRUCTION|xml.MNT_COMMENT|xml.MNT_DOCUMENT_TYPE ) )
{
// Bypass whitespace on nodes that automatically add it
xml2.FindNode( xml2.MNT_WHITESPACE );
bBypassWhitespace = TRUE;
}
}
}
}
}
// Create a document representing depth first traversal of nodes excluding whitespace
xml3.SetDoc( NULL );
xml3.AddElem( _T("NodeTraversal") );
xml2.ResetPos();
while ( 1 )
{
int nType = xml2.FindNode();
if ( nType == 0 )
{
if ( ! xml2.OutOfElem() )
break;
}
else if ( nType != xml2.MNT_WHITESPACE )
{
if ( nType == xml2.MNT_ELEMENT )
xml3.AddChildElem( _T("Node"), _CSTR(xml2.GetTagName()) );
else
xml3.AddChildElem( _T("Node"), _CSTR(xml2.GetData()) );
xml3.AddChildAttrib( _T("type"), xml2.GetNodeType() );
if ( nType == xml2.MNT_ELEMENT )
xml2.IntoElem();
}
}
// Now double check node traversal in xml3 against original xml
// This helps verify xml --> xml2 node by node copy
// and xml2 --> xml3 node traversal transformation into elements
xml.ResetPos();
xml3.ResetPos();
while ( 1 )
{
int nType = xml.FindNode();
if ( nType == 0 )
{
if ( ! xml.OutOfElem() )
break;
}
else if ( nType != xml.MNT_WHITESPACE )
{
if ( ! xml3.FindChildElem() )
{
Alert( _T("Error: missing element in traversal double check") );
break;
}
if ( nType != _ttoi(_CSTR(xml3.GetChildAttrib(_T("type")))) )
{
Alert( _T("Error: wrong type in traversal double check") );
break;
}
if ( nType == xml.MNT_ELEMENT )
xml.IntoElem();
}
}
// Add element and remove it using RemoveNode
// Note that AddElem adds a CRLF (whitespace) after the element
// which is removed as a separate node
xml.ResetPos();
xml.FindElem();
xml.InsertChildElem( _T("ITEM"), _T("RemoveNode") );
xml.IntoElem();
xml.RemoveNode();
if ( xml.FindNode( xml.MNT_WHITESPACE ) )
xml.RemoveNode();
// Remove all whitespace between nodes
xml3.ResetPos();
while ( 1 )
{
int nType = xml3.FindNode( xml3.MNT_WHITESPACE | xml3.MNT_ELEMENT );
if ( nType == 0 )
{
if ( ! xml3.OutOfElem() )
break;
}
else if ( nType == xml3.MNT_WHITESPACE )
{
if ( ! xml3.RemoveNode() )
Alert( _T("Error: RemoveNode()") );
}
else // element
{
xml3.IntoElem();
}
}
// Success?
CString csResults;
if ( ! m_nErrorCount )
csResults.Format( _T("RunTest complete %d tests and %d checks for this build\r\n"), m_nTotalZones, m_nTotalChecks );
else
csResults.Format( _T("Errors: %d\r\n"), m_nErrorCount );
OutputTestResults( csResults + m_csChecks );
return 0;
}
void CMarkupDlg::OnButtonBrowse()
{
LPCTSTR szTypes =
_T("XML Files (*.xml)|*.xml|")
_T("Text Files (*.txt)|*.txt|")
_T("All Files (*.*)|*.*||");
CFileDialog dlg( TRUE, _T("xml"), NULL, OFN_HIDEREADONLY, szTypes );
if ( dlg.DoModal() == IDCANCEL )
return;
CString csFilename = dlg.GetPathName();
GetDlgItem( IDC_EDIT_FILE )->SetWindowText( csFilename );
OutputParseResults( _T("") );
}
int CMarkupDlg::RandInt( int nNumber )
{
//
// Return an integer between 0 and nNumber
//
static BOOL bSeeded = FALSE;
if ( ! bSeeded )
{
srand( (unsigned)time( NULL ) );
bSeeded = TRUE;
}
// Sometimes rand() returns something close enough to 1 to make nRandom == nNumber
int nRandom = rand() * nNumber / RAND_MAX;
if ( nRandom == nNumber )
--nRandom;
return nRandom;
}
void CMarkupDlg::TimeStart()
{
// Keep track of time before operation
GetSystemTime( &m_stBefore );
}
int CMarkupDlg::TimeStop()
{
// Determine time span
SYSTEMTIME stAfter;
GetSystemTime( &stAfter );
int nBefore = m_stBefore.wMilliseconds + m_stBefore.wSecond * 1000 + m_stBefore.wMinute * 60000;
int nAfter = stAfter.wMilliseconds + stAfter.wSecond * 1000 + stAfter.wMinute * 60000;
int nDiff = nAfter - nBefore;
if ( m_stBefore.wHour < stAfter.wHour )
nDiff += 24*60000;
return nDiff;
}
void CMarkupDlg::OutputParseResults( CString csMsg )
{
GetDlgItem( IDC_ST_PARSE_RESULTS )->SetWindowText( csMsg );
}
void CMarkupDlg::OnButtonParse()
{
OutputParseResults( _T("") );
// Get pathname
CString csPath;
GetDlgItem( IDC_EDIT_FILE )->GetWindowText( csPath );
if ( csPath.IsEmpty() )
{
OnButtonBrowse();
GetDlgItem( IDC_EDIT_FILE )->GetWindowText( csPath );
if ( csPath.IsEmpty() )
return;
RedrawWindow();
}
// Load and parse with CMarkup
CWaitCursor wait;
#ifdef MARKUP_MSXML
CMarkupMSXML xml;
#elif defined( MARKUP_STL )
CMarkupSTL xml;
#else
CMarkup xml;
#endif
TimeStart();
BOOL bResult = xml.Load( csPath );
int nTime = TimeStop();
// Display results
CString csMsg;
#ifdef MARKUP_STL
CString csError = xml.GetError().c_str();
#else
CString csError = xml.GetError();
#endif
if ( bResult )
csMsg.Format( _T("Loaded and parsed in %s milliseconds"), AddNumSeps(nTime) );
else
csMsg.Format( _T("Load or parse error (after %s milliseconds)"), AddNumSeps(nTime) );
if ( ! csError.IsEmpty() )
csMsg = csMsg + _T("\r\n") + csError;
OutputParseResults( csMsg );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -