⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 markupdlg.cpp

📁 最有名的一个VC++外部类,Cmarkup,现在已经出了最新版8.2了,现在网上的都是6.1以下的版,希望这个新版对你们有所帮助,一些相用VC开发VML的朋友千万不要错过
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	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 + -