📄 markupdlg.cpp
字号:
xml.AddChildElem( _T("ITEM") );
xml.IntoElem();
Check( xml.AddChildSubDoc(_T("<?xml version=\"1.0\"?>\r\n<ITEM/>\r\n")) );
Check( xml.AddChildAttrib(_T("test"), strTestAttrib) );
Check( xml.IntoElem() );
Check( xml.AddChildElem(_T("NAME"), _T("carrots")) );
Check( xml.AddChildElem(_T("QTY"), _T("1")) );
strSubDoc = xml.GetSubDoc();
Check( xml.OutOfElem() );
strChildSubDoc = xml.GetChildSubDoc();
Check( strSubDoc == strChildSubDoc );
// Set xml2 from xml subdocument and modify
Check( xml2.SetDoc(xml.GetChildSubDoc()) );
Check( xml2.FindElem() );
Check( xml2.SetAttrib(_T("subtest"), strTestAttrib) );
Check( xml2.SetAttrib(_T("test"), _T("")) );
Check( xml2.FindChildElem(_T("QTY")) );
Check( xml2.RemoveChildElem() );
strSubDoc = 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(strSubDoc) );
Check( xml.IntoElem() );
Check( xml.RemoveElem() );
Check( xml.AddSubDoc(strSubDoc) );
Check( xml.GetAttrib(_T("subtest")) == strTestAttrib );
Check( xml.OutOfElem() );
Check( xml.InsertChildSubDoc(strSubDoc) );
xml.ResetChildPos();
Check( xml.InsertChildSubDoc(strSubDoc) );
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( 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")
_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
Check( xml.SavePos(_T("\xD7")) ); // crash in 7.0 to 8.2 with non-ASCII
xml.IntoElem(); // no main position
xml.SavePos();
xml.ResetPos();
xml.RestorePos();
Check( xml.OutOfElem() );
Check( xml.GetTagName() == _T("SavePosTest") );
CStringArray csaPosNames;
int nSavePos;
const int nSavePosTestSize = 100;
for ( nSavePos=0; nSavePos<nSavePosTestSize; ++nSavePos )
{
// Find an unused random name
MCD_STR strPosName;
while ( 1 )
{
int nPosNameLen = RandInt(10)+1;
for ( int nPosNameChar=0; nPosNameChar<nPosNameLen; ++nPosNameChar )
strPosName += (_TCHAR)(_T('A')+RandInt(26));
if ( ! xml.RestorePos(strPosName) )
break;
}
xml.AddChildElem( strPosName );
xml.SavePos( strPosName );
csaPosNames.Add( MCD_2PCSZ(strPosName) );
}
xml2 = xml;
xml = xml2;
for ( nSavePos=0; nSavePos<csaPosNames.GetSize(); ++nSavePos )
{
Check( xml.RestorePos((LPCTSTR)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( (LPCTSTR)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((LPCTSTR)csaPosNames[nSavePos]) );
else
{
Check( xml.RestorePos((LPCTSTR)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(MCD_2PCSZ(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(MCD_2PCSZ(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() );
xml.IntoElem();
xml.SavePos();
xml.RemoveElem();
xml2 = xml;
Check( ! xml2.RestorePos() );
// 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(MCD_2PCSZ(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(MCD_2PCSZ(xml.GetData())) == _T("test") );
Check( xml.FindElem() );
Check( xml.FindNode() == xml.MNT_TEXT );
Check( TruncToLastEOL(MCD_2PCSZ(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 )
{
MCD_STR strJunkNode = xml.GetData();
Check( ! MCD_STRISEMPTY(strJunkNode) );
}
++nGibberishNodes;
}
Check( bReachedEndOfGibberish );
#endif
// Character Reference Test, check various character decoding issues
StartCheckZone( _T("Character Reference Test") );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -