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

📄 markupdlg.cpp

📁 解析xml文件的强大包
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	Check( xml.FindElem() );
	Check( xml.GetAttrib(_T("d")) == _T("d\'d") );
	Check( xml.GetAttrib(_T("s")) == _T("s\"s") );
	Check( xml.SetAttrib( _T("d"), _T("d\'d") ) );
	Check( xml.GetAttrib(_T("d")) == _T("d\'d") );
	Check( xml.GetAttrib(_T("s")) == _T("s\"s") );
	Check( xml.GetAttrib(_T("g1")) == _T(">") );
	Check( xml.GetAttrib(_T("g2")) == _T(">") );

	// FindElem Tag Name Test
	StartCheckZone( _T("FindElem Tag Name Test") );
	xml.SetDoc( NULL );
	xml.AddElem( _T("R") );
	xml.AddChildElem( _T("N"), _T("A") );
	xml.AddChildElem( _T("Name"), _T("B") );
	xml.AddChildElem( _T("Na"), _T("C") );
	xml.AddChildElem( _T("Nam"), _T("D") );
	xml.ResetChildPos();
	Check( xml.FindChildElem(_T("Name")) );
	Check( xml.GetChildData() == _T("B") );
	Check( xml.FindChildElem(_T("Nam")) );
	Check( xml.GetChildData() == _T("D") );

	// Copy Constructor Heap Test
#ifndef MARKUP_MSXML
	StartCheckZone( _T("Copy Constructor Heap Test") );
	Check( AfxCheckMemory() );
#if defined( MARKUP_STL )
	CMarkupSTL xmlTest(xml);
#else
	CMarkup xmlTest(xml);
#endif
	Check( AfxCheckMemory() );
	xmlTest.AddElem( _T("AfterCopyEmpty") );
	Check( AfxCheckMemory() );
	xmlTest.SetDoc( NULL );
	xml = xmlTest;
	xml.AddElem( _T("AfterCopyEmpty") );
	Check( AfxCheckMemory() );
#endif

	// CDATA Section Test
	StartCheckZone( _T("CDATA Section Test") );
	xml.SetDoc( NULL );
	Check( xml.AddElem( _T("R") ) );
	Check( xml.AddChildElem( _T("C") ) );
	Check( xml.SetChildData( _T("a]]>b]]>c]]>d"), 1 ) );
	Check( xml.GetChildData() == _T("a]]>b]]>c]]>d") );
	Check( xml.IntoElem() );
	Check( xml.SetData( _T("]]>"), 1 ) );
	Check( xml.GetData() == _T("]]>") );
	CString csCDATASubDoc = _CSTR( xml.GetSubDoc() );
	csCDATASubDoc.TrimRight();
	Check( csCDATASubDoc == _T("<C><![CDATA[]]]]><![CDATA[>]]></C>") );
	csCDATASubDoc = _T("<C><![CDATA[a]]>]]&gt;<![CDATA[a]]></C>");
	Check( xml.AddSubDoc( csCDATASubDoc ) );
	Check( xml.GetData() == _T("a]]>a") );

	// Underscore tag name check
	StartCheckZone( _T("Tag Name Test") );
	xml.SetDoc( NULL );
	Check( xml.AddElem( _T("_Underscore") ) );
	CString csTagNameDoc = _CSTR(xml.GetDoc());
	Check( xml.SetDoc( csTagNameDoc ) );
	xml.FindElem();
	Check( xml.GetTagName() == _T("_Underscore") );

	// ORDER Test, simple XML example
	StartCheckZone( _T("ORDER Test") );
	xml.SetDoc( NULL );
	Check( xml.AddElem( _T("ORDER") ) );
	Check( xml.IntoElem() );
	Check( xml.AddElem( _T("ITEM") ) );
	Check( xml.AddChildElem( _T("NAME"), _T("carrots") ) );
	Check( xml.AddChildElem( _T("QTY"), _T("1") ) );
	Check( xml.AddChildElem( _T("PRICE"), _T(".98") ) );
	Check( xml.AddChildAttrib( _T("unit"), _T("1 lb") ) );
	Check( xml.AddElem( _T("ITEM") ) );
	Check( xml.AddChildElem( _T("NAME"), _T("onions") ) );
	Check( xml.AddChildElem( _T("QTY"), _T("1") ) );
	Check( xml.AddChildElem( _T("PRICE"), _T("1.10") ) );
	Check( xml.AddChildAttrib( _T("unit"), _T("3 lb bag") ) );
	Check( xml.AddChildElem( _T("SUPPLIER"), _T("Hanover") ) );

	// Create List
	StartCheckZone( _T("List Test") );
	CString csList;
	xml.ResetPos();
	Check( xml.FindElem( _T("ORDER") ) );
	while ( xml.FindChildElem( _T("ITEM") ) )
	{
		xml.IntoElem();
		xml.FindChildElem( _T("NAME") );
		csList += _CSTR(xml.GetChildData());
		csList += _T("\n");
#ifndef MARKUP_MSXML
		xml.SavePos();
#endif
		xml.OutOfElem();
	}
#if ! defined( MARKUP_MSXML )
	xml.RestorePos();
	Check( xml.GetChildData() == _T("onions") );
#endif
	Check( csList == _T("carrots\nonions\n") );

	// December Test, add and remove five elements repeatedly
	StartCheckZone( _T("December Test") );
	struct TestData { _TCHAR* szName; _TCHAR* szValue; } td[] =
	{
		_T("patridge"), _T("PEARTREE"),
		_T("2turtle"), _T("DOVES"),
		_T("3french"), _T("HENS"),
		_T("4calling"), _T("BIRDS"),
		_T("5golden"), _T("RINGS"),
	};
	int nTD;
	xml.SetDoc( _T("") );
	Check( xml.AddElem( _T("RESULT") ) );
	for ( nTD=0; nTD<=4; ++nTD )
	{
		xml.AddChildElem( _T("VAR"), td[nTD].szValue );
		xml.SetChildAttrib( _T("name"), td[nTD].szName );
	}
	for ( nTD=0; nTD<=4; ++nTD )
	{
		xml.ResetPos();
		while ( xml.FindChildElem( _T("VAR") ) )
			if ( xml.GetChildAttrib( _T("name") ) == td[nTD].szName )
			{
				xml.RemoveChildElem();
				break;
			}
		xml.AddChildElem( _T("VAR"), td[nTD].szValue );
		xml.SetChildAttrib( _T("name"), td[nTD].szName );
	}
	for ( nTD=4; nTD>=0; --nTD )
	{
		xml.ResetPos();
		while ( xml.FindChildElem( _T("VAR") ) )
			if ( xml.GetChildAttrib( _T("name") ) == td[nTD].szName )
			{
				xml.RemoveChildElem();
				break;
			}
		xml.ResetChildPos();
		xml.AddChildElem( _T("VAR"), td[nTD].szValue );
		xml.SetChildAttrib( _T("name"), td[nTD].szName );
	}
	// <RESULT>
	// <VAR name="5golden">RINGS</VAR>
	// <VAR name="4calling">BIRDS</VAR>
	// <VAR name="3french">HENS</VAR>
	// <VAR name="2turtle">DOVES</VAR>
	// <VAR name="patridge">PEARTREE</VAR>
	// </RESULT>
	xml.ResetPos();
	for ( nTD=4; nTD>=0; --nTD )
	{
		Check( xml.FindChildElem() );
		Check( xml.GetChildData() == td[nTD].szValue );
		Check( xml.GetChildAttrib( _T("name") ) == td[nTD].szName );
	}

	// Add Insert Test, test siblings created in correct sequence
	_TCHAR* aszNums[] = { _T("zero"),_T("one"),_T("two"),_T("three"),_T("four"),_T("five"),_T("six") };
	CString csInside = _T("_in6");
	StartCheckZone( _T("Insert Test") );
	xml.SetDoc( _T("") );
	xml.AddElem( _T("root") );
	xml.AddChildElem( aszNums[1] );
	xml.ResetChildPos();
	xml.AddChildElem( aszNums[3] );
	xml.ResetChildPos();
	xml.FindChildElem();
	xml.InsertChildElem( aszNums[0] );
	xml.RemoveChildElem();
	xml.InsertChildElem( aszNums[0] );
	xml.FindChildElem();
	xml.AddChildElem( aszNums[2] );
	xml.FindChildElem();
	xml.AddChildElem( aszNums[4] );
	xml.FindChildElem();
	xml.AddChildElem( aszNums[5] );
	xml.ResetChildPos();
	xml.IntoElem();
	xml.FindElem();
	xml.RemoveElem();
	xml.InsertElem( aszNums[0] );
	xml.ResetMainPos();
	xml.AddElem( aszNums[6] );
	xml.IntoElem();
	xml.AddElem( aszNums[1] + csInside );
	xml.ResetMainPos();
	xml.AddElem( aszNums[3] + csInside );
	xml.ResetMainPos();
	xml.FindElem();
	xml.InsertElem( aszNums[0] + csInside );
	xml.RemoveElem();
	xml.ResetMainPos();
	xml.InsertElem( aszNums[0] + csInside );
	xml.FindElem();
	xml.AddElem( aszNums[2] + csInside );
	xml.FindElem();
	xml.AddElem( aszNums[4] + csInside );
	xml.FindElem();
	xml.AddElem( aszNums[5] + csInside );
	// Should result in the following (indented to illustrate):
	// <root>
	//   <zero/>
	//   <one/>
	//   <two/>
	//   <three/>
	//   <four/>
	//   <five/>
	//   <six>
	//     <zero_in6/>
	//     <one_in6/>
	//     <two_in6/>
	//     <three_in6/>
	//     <four_in6/>
	//     <five_in6/>
	//   </six>
	// </root>
	xml.ResetPos();
	for ( int nIT=0; nIT<7; ++nIT )
	{
		Check( xml.FindChildElem() );
		Check( xml.IntoElem() );
		Check( xml.GetTagName() == aszNums[nIT] );
		if ( nIT == 6 )
		{
			for ( int nITinner=0; nITinner<6; ++nITinner )
			{
				Check( xml.FindChildElem() );
				Check( _CSTR(xml.GetChildTagName()) == CString(aszNums[nITinner])+csInside );
			}
		}
		Check( xml.OutOfElem() );
	}

	// Palmer Test
	StartCheckZone( _T("Palmer Test") );
	xml.SetDoc( _T("") );
	Check( xml.AddElem( _T("one") ) );
	Check( xml.AddChildElem( _T("two") ) );
	Check( xml.RemoveChildElem() );
	Check( xml.AddChildElem( _T("three") ) );
	// <one>
	// <three/>
	// </one>
	xml.ResetPos();
	Check( xml.FindChildElem() );
	Check( xml.GetChildTagName() == _T("three") );

	// SetData Test, check empty elements, normal, and CDATA
	StartCheckZone( _T("SetData Test") );
	Check( xml.SetDoc( _T("<?xml version=\"1.0\"?>\r\n<ROOT>data</ROOT>") ) );
	Check( xml.FindElem() );
	xml.SetData( _T("moredata<>&") );
	Check( xml.GetData() == _T("moredata<>&") );
	xml.SetData( _T("n<6"), 1 );
	Check( xml.GetData() == _T("n<6") );
	xml.SetData( _T("") );
	xml.AddChildElem( _T("CHILD") );
	xml.SetChildData( _T("data<>&") );
	Check( xml.GetChildData() == _T("data<>&") );
	xml.SetChildData( _T("n<6"), 1 );
	xml.InsertChildElem( _T("CHILD") );
	xml.IntoElem();
	Check( xml.SetData(_T("")) );
	xml.SetData( _T("final") );
	Check( xml.GetData() == _T("final") );
	xml.FindElem();
	Check( xml.GetData() == _T("n<6") );

	// Car Test, add and replace randomly chosen attributes
	StartCheckZone( _T("Random Car Part Test") );
	struct CarTestData { _TCHAR* szLow; _TCHAR* szUp; _TCHAR* szMix; } aCT[] =
	{
		_T("up"), _T("SKY"), _T("Light"),
		_T("down"), _T("FLOOR"), _T("Dust"),
		_T("left"), _T("DOOR"), _T("Handle"),
		_T("right"), _T("SEAT"), _T("Gear"),
		_T("back"), _T("TRUNK"), _T("Tread"),
		_T("forward"), _T("GRILL"), _T("Motor"),
		_T(""), _T(""), _T("")
	};
	xml.SetDoc( _T("") );
	xml.AddElem( _T("CAR") );
	int nAt, nPart;
	LPCTSTR szLow, szUp, szMix;
	for ( nAt = 0; nAt < 20; ++nAt )
	{
		szLow = aCT[RandInt(6)].szLow;
		szMix = aCT[RandInt(6)].szMix;
		xml.SetAttrib( szLow, szMix );
		Check( xml.GetAttrib(szLow) == szMix );
	}
	for ( nPart=0; nPart<100; ++nPart )
	{
		xml.AddChildElem( aCT[RandInt(6)].szUp );
		for ( nAt = 0; nAt < 8; ++nAt )
		{
			szLow = aCT[RandInt(6)].szLow;
			szMix = aCT[RandInt(6)].szMix;
			xml.SetChildAttrib( szLow, szMix );
			Check( xml.GetChildAttrib(szLow) == szMix );
		}
		szLow = aCT[RandInt(6)].szLow;
		szUp = aCT[RandInt(6)].szUp;
		xml.SetChildAttrib( szLow, szUp );
		Check( xml.GetChildAttrib(szLow) == szUp );
	}
	CString csCarDoc = _CSTR(xml.GetDoc());
	Check( xml.SetDoc( csCarDoc ) );

	// Car Attrib Speed Test
	StartCheckZone( _T("Car Attrib Speed Test") );
	xml.SetDoc( NULL );
	xml.AddElem( _T("CARSPEED") );
	TimeStart();
	for ( nPart=0; nPart<200; ++nPart )
	{
		xml.AddChildElem( aCT[RandInt(6)].szUp );
		for ( nAt = 0; nAt < 4; ++nAt )
		{
			szLow = aCT[RandInt(6)].szLow;
			szMix = aCT[RandInt(6)].szMix;
			xml.SetChildAttrib( szLow, szMix );
			szLow = aCT[RandInt(6)].szLow;
			szUp = aCT[RandInt(6)].szUp;
			xml.SetChildAttrib( szLow, szUp );
		}
	}
	int nAttribCreateTime = TimeStop();
	xml.ResetPos();
	TimeStart();
	CString csAttribName, csAttribs;
	while ( xml.FindChildElem() )
	{
		xml.IntoElem();
		nAt = 0;
		csAttribs.Empty();
		csAttribName = _CSTR(xml.GetAttribName( nAt ));
		while ( ! csAttribName.IsEmpty() )
		{
			csAttribs += _CSTR(xml.GetAttrib( csAttribName ));
			++nAt;
			csAttribName = _CSTR(xml.GetAttribName( nAt ));
		}
		xml.OutOfElem();
	}
	int nAttribNavTime = TimeStop();
	if ( nAttribCreateTime > 400 || nAttribNavTime > 400 )
	{
		CString csAttribTime;
		csAttribTime.Format( _T("Attribute Performance Results: create %d search %d\r\n"), nAttribCreateTime, nAttribNavTime );
		m_csChecks += csAttribTime;
	}

	// SubDoc Test, use subdocument methods
	StartCheckZone( _T("SubDoc Test") );
	CString csTestAttrib = _T("<<&\"symb>>");
	CString csSubDoc, csChildSubDoc;
	xml.SetDoc( _T("") );
	Check( xml.AddElem(_T("ORDER")) );
	xml.AddChildElem( _T("ITEM") );
	xml.IntoElem();
	Check( xml.AddChildSubDoc(_T("<?xml version=\"1.0\"?>\r\n<ITEM/>\r\n")) );
	Check( xml.AddChildAttrib(_T("test"), csTestAttrib) );
	Check( xml.IntoElem() );
	Check( xml.AddChildElem(_T("NAME"), _T("carrots")) );
	Check( xml.AddChildElem(_T("QTY"), _T("1")) );
	csSubDoc = _CSTR(xml.GetSubDoc());
	Check( xml.OutOfElem() );
	csChildSubDoc = _CSTR(xml.GetChildSubDoc());
	Check( csSubDoc == csChildSubDoc );
	// Set xml2 from xml subdocument and modify
	Check( xml2.SetDoc(_CSTR(xml.GetChildSubDoc())) );
	Check( xml2.FindElem() );
	Check( xml2.SetAttrib(_T("subtest"), csTestAttrib) );
	Check( xml2.SetAttrib(_T("test"), _T("")) );
	Check( xml2.FindChildElem(_T("QTY")) );
	Check( xml2.RemoveChildElem() );
	csSubDoc = _CSTR(xml2.GetDoc());
#if ! defined( MARKUP_MSXML )
	// MSXML: Invalid subdocument causes first-chance exception
	// It works, but this #ifdef avoids alarming us with the Debug output
	Check( ! xml.AddChildSubDoc(_T("invalidsub<doc>")) );
#endif
	Check( xml.AddChildSubDoc(csSubDoc) );
	Check( xml.IntoElem() );
	Check( xml.RemoveElem() );
	Check( xml.AddSubDoc(csSubDoc) );
	Check( _CSTR(xml.GetAttrib(_T("subtest"))) == csTestAttrib );
	Check( xml.OutOfElem() );
	Check( xml.InsertChildSubDoc(csSubDoc) );
	xml.ResetChildPos();
	Check( xml.InsertChildSubDoc(csSubDoc) );
	xml.IntoElem();
	xml.FindChildElem();
	Check( xml.GetChildData() == _T("carrots") );
	// Brannan Test: subdocument with no children getting flagged as empty in 7.0
	xml.ResetChildPos();
	xml.FindElem();
	xml.FindChildElem( _T("QTY") );
	xml.AddChildSubDoc( _CSTR(xml.GetChildSubDoc()) );
	Check( xml.GetChildData() == _T("1") );

	// Comments Test, make sure it bypasses declaration, DTD, and comments
	StartCheckZone( _T("Comments Test") );
	CString csPTDoc =
		_T("<?xml version=\"1.0\"?>\n")
		_T("<!DOCTYPE PARSETEST [\n")
		_T("<!ELEMENT PARSETEST (ITEM*)>\n")
		_T("<!ATTLIST PARSETEST v CDATA \"\" s CDATA \"\">\n")
		_T("<!ELEMENT ITEM ANY>\n")

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -