📄 markupdlg.cpp
字号:
_T("<!ATTLIST PARSETEST v CDATA \"\" s CDATA \"\">\n")
_T("<!ELEMENT ITEM ANY>\n")
_T("<!ATTLIST ITEM note CDATA \"\">\n")
_T("]>\n")
_T("<PARSETEST v=\"1\" s=\'6\'>\n")
_T("<!--- </P>& special chars -->\n")
_T("<ITEM note=\"Here's to "us"\"/>\n")
_T("<ITEM note=\"see data\">Here's to \"us\"</ITEM>\n")
_T("</PARSETEST>\n")
;
Check( xml.SetDoc( csPTDoc ) );
Check( xml.FindChildElem() );
Check( xml.GetAttrib( _T("v") ) == _T("1") );
Check( xml.GetAttribName(0) == _T("v") );
Check( xml.GetAttribName(1) == _T("s") );
Check( xml.GetAttribName(2) == _T("") );
Check( xml.GetChildAttrib(_T("note")) == _T("Here's to \"us\"") );
Check( xml.IntoElem() );
Check( xml.FindElem() );
Check( xml.GetData() == _T("Here's to \"us\"") );
#if ! defined( MARKUP_MSXML )
// Save Restore Position Test
StartCheckZone( _T("Save Restore Position Test") );
xml.SetDoc( NULL );
xml.AddElem( _T("SavePosTest") );
Check( ! xml.RestorePos() ); // crash in 6.6 and 7.x when no saved pos yet
xml.IntoElem(); // no main position
xml.SavePos();
xml.ResetPos();
xml.RestorePos();
Check( xml.OutOfElem() );
Check( xml.GetTagName() == "SavePosTest" );
CStringArray csaPosNames;
int nSavePos;
const int nSavePosTestSize = 100;
for ( nSavePos=0; nSavePos<nSavePosTestSize; ++nSavePos )
{
// Find an unused random name
CString csPosName;
while ( 1 )
{
int nPosNameLen = RandInt(10)+1;
for ( int nPosNameChar=0; nPosNameChar<nPosNameLen; ++nPosNameChar )
csPosName += (_TCHAR)(_T('A')+RandInt(26));
if ( ! xml.RestorePos(csPosName) )
break;
}
xml.AddChildElem( csPosName );
xml.SavePos( csPosName );
csaPosNames.Add( csPosName );
}
xml2 = xml;
xml = xml2;
for ( nSavePos=0; nSavePos<csaPosNames.GetSize(); ++nSavePos )
{
Check( xml.RestorePos(csaPosNames[nSavePos]) );
Check( xml.GetChildTagName() == (LPCTSTR)csaPosNames[nSavePos] );
// Move saved position to TEMP2 child
Check( xml.IntoElem() );
Check( xml.AddChildElem( _T("TEMP") ) );
Check( xml.IntoElem() );
Check( xml.AddChildElem( _T("TEMP2") ) );
Check( xml.IntoElem() );
xml.SavePos( csaPosNames[nSavePos] );
if ( RandInt(2) ) // 1 in 2
Check( xml.OutOfElem() );
if ( RandInt(2) ) // 1 in 2
Check( xml.OutOfElem() );
if ( nSavePos % 2 )
xml.RemoveElem();
}
for ( nSavePos=0; nSavePos<csaPosNames.GetSize(); ++nSavePos )
{
if ( nSavePos % 2 )
Check( ! xml.RestorePos(csaPosNames[nSavePos]) );
else
{
Check( xml.RestorePos(csaPosNames[nSavePos]) );
Check( xml.OutOfElem() );
Check( xml.OutOfElem() );
Check( xml.GetTagName() == (LPCTSTR)csaPosNames[nSavePos] );
}
}
// Save Restore Example
int anSomeData[] = { 10, 30, 50, 20, 90, 0 };
int nD;
StartCheckZone( _T("Save Restore Example") );
xml.SetDoc( NULL );
xml.AddElem( _T("SavePosExample") );
xml.IntoElem(); // no main position
xml.AddElem( _T("Total") );
xml.SavePos( _T("Total") );
xml.AddElem( _T("Data") );
xml.SavePos( _T("Data") );
for ( nD=0; anSomeData[nD]; ++nD )
{
xml.RestorePos( _T("Total") );
xml.SetData( _ttoi(_CSTR(xml.GetData())) + anSomeData[nD] );
xml.RestorePos( _T("Data") );
xml.AddChildElem( _T("Value"), anSomeData[nD] );
}
xml2.SetDoc( NULL );
xml2.AddElem( _T("SavePosExample") );
xml2.IntoElem();
xml2.AddElem( _T("Total") );
xml2.AddElem( _T("Data") );
for ( nD=0; anSomeData[nD]; ++nD )
{
xml2.ResetMainPos();
xml2.FindElem();
xml2.SetData( _ttoi(_CSTR(xml2.GetData())) + anSomeData[nD] );
xml2.FindElem();
xml2.AddChildElem( _T("Value"), anSomeData[nD] );
}
Check( xml.GetDoc() == xml2.GetDoc() );
// Prepend XML Declaration test
// (not implemented in MSXML because modifying XML Declaration is restricted)
StartCheckZone( _T("Prepend XML Declaration") );
Check( ! xml.SetDoc( _T("<?xml version=\"1.0\"?>\r\n") ) );
Check( xml.AddElem( _T("ROOT") ) );
Check( xml.IntoElem() );
Check( xml.AddElem( _T("CHILD") ) );
xml.ResetPos();
Check( xml.FindElem( _T("ROOT") ) );
Check( xml.FindChildElem( _T("CHILD") ) );
// Copy Constructor Test (not MSXML!)
StartCheckZone( _T("Copy Constructor Test non-MSXML") );
xml.SetDoc( NULL );
xml2 = xml;
xml.AddElem( _T("R") );
xml.AddChildElem( _T("C") );
xml2 = xml;
xml2.FindChildElem();
Check( xml2.GetChildTagName() == xml.GetChildTagName() );
// Ill-formed Markup Test
StartCheckZone( _T("Ill-formed Markup Test") );
Check( ! xml.SetDoc( _T("<P>Hello<BR>Hi") ) );
Check( xml.FindElem( _T("P") ) );
Check( xml.FindNode() == xml.MNT_TEXT );
Check( xml.GetData() == _T("Hello") );
Check( xml.FindElem( _T("BR") ) );
Check( xml.FindNode() == xml.MNT_TEXT );
Check( xml.GetData() == _T("Hi") );
Check( xml.AddElem( _T("P"), _T("Hola") ) );
Check( xml.GetData() == _T("Hola") );
Check( ! xml.SetDoc( _T("<P>Hello<BR>Hi</P>") ) );
Check( xml.FindElem( _T("P") ) );
xml.SetDocFlags( xml.MDF_IGNORECASE );
Check( xml.SetDoc( _T("<A></a>") ) );
Check( xml.FindElem( _T("a") ) );
Check( xml.SetAttrib( _T("a1"), _T("V1") ) );
Check( xml.SetAttrib( _T("A1"), _T("v1") ) );
Check( ! xml.AddSubDoc( _T("<b>") ) );
xml.ResetPos();
Check( xml.FindElem( _T("a") ) );
Check( xml.GetAttrib(_T("A1")) == _T("v1") );
Check( xml.GetAttrib(_T("a1")) == _T("v1") );
Check( xml.FindElem( _T("B") ) );
xml.SetDocFlags( 0 );
Check( ! xml.SetDoc( _T("<A><B></C></B></A>") ) );
Check( xml.FindElem() );
Check( xml.IntoElem() );
Check( xml.FindElem( _T("B") ) );
Check( xml.IntoElem() );
Check( xml.FindNode() == xml.MNT_LONE_END_TAG );
Check( xml.GetTagName() == _T("C") );
Check( xml.GetData() == _T("C") );
Check( xml.OutOfElem() );
Check( xml.SetElemContent( _T("data") ) );
Check( ! xml.InsertSubDoc( _T("<S/><S/>") ) );
Check( ! xml.SetElemContent( _T("<SC>") ) );
Check( xml.FindElem( _T("S") ) );
// Multi-Rooted Subdoc Test
StartCheckZone( _T("Multi-Rooted Subdoc Test") );
Check( xml.SetElemContent( _T("<SC><SCC/></SC><SC><SCC/></SC><SC/>") ) );
Check( xml.FindChildElem( _T("SC") ) );
Check( xml.SetChildAttrib( _T("asc"), _T("verbose") ) );
Check( xml.IntoElem() );
Check( xml.FindChildElem( _T("SCC") ) );
Check( xml.SetChildAttrib( _T("ascc"), _T("verbose") ) );
Check( xml.OutOfElem() );
xml.ResetMainPos();
Check( xml.FindElem( _T("S") ) );
Check( xml.FindChildElem( _T("SC") ) );
Check( xml.SetChildAttrib( _T("asc"), _T("verbose") ) );
Check( xml.SetChildAttrib( _T("asc2"), 2 ) );
Check( xml.FindElem( _T("S") ) );
Check( xml.FindChildElem( _T("SC") ) );
Check( xml.FindChildElem( _T("SC") ) );
Check( xml.FindElem( _T("B") ) );
// Don't mistake end slash on non-quoted value for empty element (see cDminus2)
StartCheckZone( _T("Non Quoted Attribute Test") );
Check( xml.SetDoc( _T("<A href=/path/>ok</A>") ) );
Check( xml.FindElem() );
Check( xml.GetAttrib(_T("href")) == _T("/path/") );
// AddElem Flags Test
StartCheckZone( _T("AddElem Flags Test") );
xml.SetDoc( NULL );
xml.AddElem( _T("ROOT"), NULL, xml.MNF_WITHNOLINES );
xml.AddChildElem( _T("A"), _T(""), xml.MNF_WITHNOEND|xml.MNF_WITHNOLINES );
Check( xml.IntoElem() );
Check( xml.AddElem( _T("A"), _T(""), xml.MNF_WITHNOEND ) );
Check( xml.AddChildElem( _T("B") ) );
Check( xml.AddChildElem( _T("B"), _T("D") ) );
Check( xml.OutOfElem() );
xml.AddChildElem( _T("BR"), _T(""), xml.MNF_WITHXHTMLSPACE );
xml.SetChildAttrib( _T("class"), _T("MinorBrk") );
Check( ! xml.SetDoc( _T("<A>test") ) );
Check( xml.FindElem() );
Check( xml.FindNode() == xml.MNT_TEXT );
Check( xml.GetData() == _T("test") );
Check( ! xml.SetDoc( _T("<A>test\r\n") ) );
Check( xml.FindElem() );
Check( xml.FindNode() == xml.MNT_TEXT );
Check( TruncToLastEOL(_CSTR(xml.GetData())) == _T("test") );
Check( ! xml.SetDoc( _T("<A>test\r\n <B>okay") ) );
Check( xml.FindElem() );
Check( xml.FindNode() == xml.MNT_TEXT );
Check( TruncToLastEOL(_CSTR(xml.GetData())) == _T("test") );
Check( xml.FindElem() );
Check( xml.FindNode() == xml.MNT_TEXT );
Check( TruncToLastEOL(_CSTR(xml.GetData())) == _T("okay") );
xml.ResetMainPos();
Check( xml.FindElem() );
Check( xml.SetData(_T("t2")) );
Check( xml.GetData() == _T("t2") );
Check( xml.SetData(_T("test3")) );
Check( xml.GetData() == _T("test3") );
xml.SetDoc( NULL );
xml.AddElem( _T("P"), _T(""), xml.MNF_WITHNOLINES );
xml.IntoElem();
Check( xml.AddNode( xml.MNT_TEXT, _T("First line") ) );
Check( xml.AddElem( _T("BR"), _T(""), xml.MNF_WITHNOEND | xml.MNF_WITHNOLINES ) );
Check( xml.AddNode( xml.MNT_TEXT, _T("Second line") ) );
Check( xml.GetDoc() == _T("<P>First line<BR>Second line</P>") );
xml.OutOfElem();
xml.SetElemContent( _T("First line<BR>Second line") );
Check( xml.GetDoc() == _T("<P>First line<BR>Second line</P>") );
// Ill-formed SubDoc Fragment Test
StartCheckZone( _T("SubDoc Fragment Test") );
Check( ! xml.SetDoc( _T("<A/><B/>") ) );
Check( ! xml.SetDoc( _T(" something ") ) );
Check( ! xml.AddSubDoc( _T("<A>") ) );
Check( ! xml.AddSubDoc( _T("<B>") ) );
Check( ! xml.AddSubDoc( _T("</A>") ) ); // lone end tag
Check( xml.AddSubDoc( _T("<C/>") ) );
Check( ! xml.SetElemContent( _T("<CC>") ) );
Check( xml.GetTagName() == _T("C") );
Check( xml.FindChildElem() );
Check( xml.GetChildTagName() == _T("CC") );
Check( xml.SetElemContent( _T("d") ) );
Check( xml.GetData() == _T("d") );
Check( ! xml.SetElemContent( _T("<DD>") ) );
Check( xml.FindChildElem() );
Check( xml.GetChildTagName() == _T("DD") );
// Replace element between two text nodes
StartCheckZone( _T("Replace Element Test") );
Check( xml.SetDoc( _T("T<A/>T") ) );
Check( xml.FindElem( _T("A") ) );
Check( xml.RemoveNode() );
Check( xml.GetNodeType() == xml.MNT_TEXT );
Check( xml.GetData() == _T("T") );
Check( xml.AddNode( xml.MNT_ELEMENT, _T("B") ) );
Check( xml.SetAttrib( _T("v"), 1 ) );
Check( xml.GetTagName() == _T("B") );
Check( xml.GetAttrib( _T("v") ) == _T("1") );
Check( xml.IntoElem() );
Check( xml.AddNode( xml.MNT_TEXT, _T("T0") ) );
Check( xml.AddNode( xml.MNT_ELEMENT, _T("C1") ) );
Check( xml.AddNode( xml.MNT_TEXT, _T("T1") ) );
Check( xml.AddNode( xml.MNT_ELEMENT, _T("C2") ) );
Check( xml.AddNode( xml.MNT_TEXT, _T("T2") ) );
xml.ResetMainPos();
Check( xml.FindElem( _T("C1") ) );
Check( xml.RemoveNode() );
Check( xml.GetNodeType() == xml.MNT_TEXT );
Check( xml.GetData() == _T("T0") );
Check( xml.AddNode( xml.MNT_ELEMENT, _T("C1") ) );
Check( xml.FindElem( _T("C2") ) );
Check( xml.RemoveNode() );
Check( xml.GetNodeType() == xml.MNT_TEXT );
Check( xml.GetData() == _T("T1") );
Check( xml.AddNode( xml.MNT_ELEMENT, _T("C2") ) );
Check( xml.FindNode() == xml.MNT_TEXT );
Check( xml.GetData() == _T("T2") );
xml.ResetMainPos();
Check( xml.FindElem( _T("C2") ) );
Check( xml.IntoElem() );
Check( xml.AddNode( xml.MNT_ELEMENT, _T("D3") ) );
Check( xml.AddNode( xml.MNT_TEXT, _T("T0") ) );
Check( xml.AddNode( xml.MNT_ELEMENT, _T("D4") ) );
Check( xml.IntoElem() );
Check( xml.AddNode( xml.MNT_ELEMENT, _T("E1") ) );
Check( xml.SetData( _T("X") ) );
Check( xml.OutOfElem() );
Check( xml.OutOfElem() );
xml.ResetMainPos();
Check( xml.FindElem() );
Check( xml.GetTagName() == _T("C1") );
Check( xml.IntoElem() );
Check( xml.AddNode( xml.MNT_TEXT, _T("T1") ) );
Check( xml.AddNode( xml.MNT_ELEMENT, _T("D2") ) );
Check( xml.AddNode( xml.MNT_TEXT, _T("T2") ) );
xml.ResetMainPos();
Check( xml.FindElem() );
Check( xml.GetTagName() == _T("D2") );
xml.ResetMainPos();
Check( xml.InsertNode( xml.MNT_ELEMENT, _T("D1") ) );
Check( xml.InsertNode( xml.MNT_TEXT, _T("TEST") ) );
Check( xml.SetData( _T("T0") ) );
Check( xml.FindNode() == xml.MNT_ELEMENT );
Check( xml.SetData( _T("X") ) );
Check( xml.FindElem( _T("D2") ) );
xml.ResetMainPos();
Check( xml.FindNode() == xml.MNT_TEXT );
Check( xml.GetData() == _T("T0") );
Check( xml.OutOfElem() );
xml.ResetMainPos();
Check( xml.FindElem( _T("C2") ) );
Check( xml.IntoElem() );
Check( xml.FindNode() == xml.MNT_ELEMENT );
Check( xml.GetTagName() == _T("D3") );
Check( xml.FindNode() == xml.MNT_TEXT );
Check( xml.GetData() == _T("T0") );
Check( xml.FindNode() == xml.MNT_ELEMENT );
Check( xml.GetTagName() == _T("D4") );
Check( xml.FindChildElem() );
Check( xml.GetChildData() == _T("X") );
// With Entities Test
StartCheckZone( _T("With Entities Test") );
xml.SetDoc(NULL);
Check( xml.AddElem( _T("A"), _T(" "), xml.MNF_WITHREFS ) );
Check( xml.GetData() == _T(" ") );
Check( xml.AddChildElem( _T("CH"), _T("&"), xml.MNF_WITHREFS ) );
Check( xml.GetChildData() == _T("&") );
Check( xml.SetChildData( _T(" "), xml.MNF_WITHREFS ) );
Check( xml.GetChildData() == _T(" ") );
Check( xml.SetChildData( _T("&"), xml.MNF_WITHREFS ) );
Check( xml.GetChildData() == _T("&") );
Check( xml.SetChildData( _T("&&"), xml.MNF_WITHREFS ) );
Check( xml.GetChildData() == _T("&&") );
Check( xml.SetChildData( _T(" 2"), xml.MNF_WITHREFS ) );
Check( xml.GetChildData() == _T(" 2") );
Check( xml.EscapeText( _T(" 2"), xml.MNF_WITHREFS ) == _T("&#3 2") );
Check( xml.EscapeText( _T("\""), xml.MNF_ESCAPEQUOTES ) == _T(""") );
Check( xml.EscapeText( _T("\"") ) == _T("\"") );
Check( xml.EscapeText( _T(" \'"), xml.MNF_WITHREFS|xml.MNF_ESCAPEQUOTES ) == _T(" '") );
// Node Error Test -- even gibberish will not stop node navigation
// But there is no guaranteed node parsing system with gibberish
StartCheckZone( _T("Node Error Test") );
Check( ! xml.SetDoc( _T("<) <> <* ><<>>") ) );
BOOL bReachedEndOfGibberish = FALSE;
int nGibberishNodes = 0;
while ( nGibberishNodes < 100 )
{
int nGNType = xml.FindNode();
if ( nGNType == 0 )
{
bReachedEndOfGibberish = TRUE;
break;
}
else if ( nGNType == xml.MNT_NODE_ERROR )
{
CString csJunkNode = _CSTR(xml.GetData());
Check( ! csJunkNode.IsEmpty() );
}
++nGibberishNodes;
}
Check( bReachedEndOfGibberish );
#endif
// Character Reference Test, check various character decoding issues
StartCheckZone( _T("Character Reference Test") );
Check( xml.SetDoc(
_T("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
_T("<CHAR v='C""S'>\n")
_T("<CORE><<>>&&''""</CORE>\n")
_T("<SPACE xml:space=\"preserve\">  		 
</SPACE>\n")
_T("<REF>中国人</REF>\n")
_T("</CHAR>\n")
) );
Check( xml.FindChildElem(_T("CORE")) );
Check( xml.GetAttrib( _T("v") ) == _T("C\"\"S") );
Check( xml.GetChildData() == _T("<<>>&&''\"\"") );
Check( xml.FindChildElem(_T("SPACE")) );
Check( xml.GetChildData() == _T(" \t\t\n\n") );
Check( xml.FindChildElem(_T("REF")) );
#if defined( _UNICODE )
Check( xml.GetChildData() == _T("\x4E2D\x56FD\x4EBA") );
#elif defined( _MBCS )
setlocale( LC_ALL, "C" );
if ( setlocale(LC_CTYPE,".936") ) // is GB2312 DBCS code page available?
Check( xml.GetChildData() == _T("\xD6\xD0\xB9\xFA\xC8\xCB") ); // DBCS
else
Check( xml.GetChildData() == _T("中国人") ); // unmodified
#elif ! defined( MARKUP_MSXML )
// UTF-8 (note: MSXML converts chinese character reference to UCS-2, but not UTF-8)
Check( xml.GetChildData() == _T("\xE4\xB8\xAD\xE5\x9B\xBD\xE4\xBA\xBA") );
#endif
#if defined( _MBCS )
// GB2312 Test, check getting and setting of sample GB2312 chars
StartCheckZone( _T("GB2312 Test") );
CString csSampleGB2312Chars = _T("\xD6\xD0\xB9\xFA\xC8\xCB");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -