亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? markup.cpp

?? 解析xml文件的強大包
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
				}
			}
		}
		else if ( cD == _T('<') )
		{
			nParseFlags |= PD_OPENTAG;
		}
		else
		{
			nNodeType = MNT_WHITESPACE;
			if ( _tcschr(_T(" \t\n\r"),(_TCHAR)cD) )
				nParseFlags |= PD_TEXTORWS;
			else
				FINDNODETYPE( _T("<"), MNT_TEXT, 0 )
		}
		pDoc += _tclen( pDoc );
	}
	token.nNext = nR + 1;
	node.nLength = token.nNext - node.nStart;
	node.nNodeType = nNodeType;
	return nNodeType;
}

CString CMarkup::x_GetPath( int iPos ) const
{
	CString strPath;
	while ( iPos )
	{
		CString strTagName = x_GetTagName( iPos );
		int iPosParent = m_aPos[iPos].iElemParent;
		int iPosSib = 0;
		int nCount = 0;
		while ( iPosSib != iPos )
		{
			iPosSib = x_FindElem( iPosParent, iPosSib, strTagName );
			++nCount;
		}
		if ( nCount > 1 )
		{
			_TCHAR szPred[25];
			_stprintf( szPred, _T("[%d]"), nCount );
			strPath = _T("/") + strTagName + szPred + strPath;
		}
		else
			strPath = _T("/") + strTagName + strPath;
		iPos = iPosParent;
	}
	return strPath;
}

CString CMarkup::x_GetTagName( int iPos ) const
{
	// Return the tag name at specified element
	TokenPos token( m_strDoc, m_nFlags );
	token.nNext = m_aPos[iPos].nStart + 1;
	if ( ! iPos || ! x_FindName( token ) )
		return _T("");

	// Return substring of document
	return x_GetToken( token );
}

bool CMarkup::x_FindAttrib( CMarkup::TokenPos& token, LPCTSTR szAttrib, int n/*=0*/ )
{
	// Return true if found, otherwise false and token.nNext is new insertion point
	// If szAttrib is NULL find attrib n and leave token at attrib name
	// If szAttrib is given, find matching attrib and leave token at value
	// support non-well-formed attributes e.g. href=/advanced_search?hl=en, nowrap
	// token also holds start and length of preceeding whitespace to support remove
	//
	int nPreSpaceStart;
	int nPreSpaceLength;
	int nChar;
	_TCHAR cFirstChar;
	LPCTSTR szDoc = token.szDoc;
	int nAttrib = -1; // starts at tag name
	int nFoundAttribNameR = 0;
	bool bAfterEqual = false;
	while ( 1 )
	{
		// Starting at token.nNext, bypass whitespace and find the next token
		nChar = token.nNext;
		nPreSpaceStart = nChar;
		if ( ! x_FindAny(szDoc,nChar) )
			break;
		nPreSpaceLength = nChar - nPreSpaceStart;

		// Is it an opening quote?
		cFirstChar = szDoc[nChar];
		if ( cFirstChar == _T('\"') || cFirstChar == _T('\'') )
		{
			token.nTokenFlags |= MNF_QUOTED;

			// Move past opening quote
			++nChar;
			token.nL = nChar;

			// Look for closing quote
			while ( szDoc[nChar] && szDoc[nChar] != cFirstChar )
				nChar += (int)_tclen( &szDoc[nChar] );

			// Set right to before closing quote
			token.nR = nChar - 1;

			// Set nChar past closing quote unless at end of document
			if ( szDoc[nChar] )
				++nChar;
		}
		else
		{
			token.nTokenFlags &= ~MNF_QUOTED;

			// Go until special char or whitespace
			token.nL = nChar;
			if ( bAfterEqual )
			{
				while ( szDoc[nChar] && ! _tcschr(_T(" \t\n\r>"),szDoc[nChar]) )
					nChar += (int)_tclen( &szDoc[nChar] );
			}
			else
			{
				while ( szDoc[nChar] && ! _tcschr(_T("= \t\n\r>/?"),szDoc[nChar]) )
					nChar += (int)_tclen( &szDoc[nChar] );
			}

			// Adjust end position if it is one special char
			if ( nChar == token.nL )
				++nChar; // it is a special char
			token.nR = nChar - 1;
		}

		// nNext points to one past last char of token
		token.nNext = nChar;

		if ( ! bAfterEqual && ! (token.nTokenFlags&MNF_QUOTED) )
		{
			// Is it an equal sign?
			_TCHAR cChar = szDoc[token.nL];
			if ( cChar == _T('=') )
			{
				bAfterEqual = true;
				continue;
			}

			// Is it the right angle bracket?
			if ( cChar == _T('>') || cChar == _T('/') || cChar == _T('?') )
			{
				token.nNext = nPreSpaceStart;
				break; // attrib not found
			}

			if ( nFoundAttribNameR )
				break;

			// Attribute name
			if ( nAttrib != -1 )
			{
				if ( ! szAttrib )
				{
					if ( nAttrib == n )
						return true; // found by number
				}
				else if ( token.Match(szAttrib) )
				{
					// Matched attrib name, go forward to value
					nFoundAttribNameR = token.nR;
					token.nPreSpaceStart = nPreSpaceStart;
					token.nPreSpaceLength = nPreSpaceLength;
				}
			}
			++nAttrib;
		}
		else if ( nFoundAttribNameR )
			break;
		bAfterEqual = false;
	}

	if ( nFoundAttribNameR )
	{
		if ( ! bAfterEqual )
		{
			// when attribute has no value the value is the attribute name
			token.nL = token.nPreSpaceStart + token.nPreSpaceLength;
			token.nR = nFoundAttribNameR;
			token.nNext = nFoundAttribNameR + 1;
		}
		return true; // found by name
	}
	return false; // not found
}

CString CMarkup::x_GetAttrib( int iPos, LPCTSTR szAttrib ) const
{
	// Return the value of the attrib
	TokenPos token( m_strDoc, m_nFlags );
	if ( iPos && m_nNodeType == MNT_ELEMENT )
		token.nNext = m_aPos[iPos].nStart + 1;
	else if ( iPos == m_iPos && m_nNodeLength && m_nNodeType == MNT_PROCESSING_INSTRUCTION )
		token.nNext = m_nNodeOffset + 2;
	else
		return _T("");

	if ( szAttrib && x_FindAttrib( token, szAttrib ) )
		return UnescapeText( &token.szDoc[token.nL], token.Length() );
	return _T("");
}

bool CMarkup::x_SetAttrib( int iPos, LPCTSTR szAttrib, int nValue )
{
	// Convert integer to string
	_TCHAR szVal[25];
	_stprintf( szVal, _T("%d"), nValue );
	return x_SetAttrib( iPos, szAttrib, szVal );
}

bool CMarkup::x_SetAttrib( int iPos, LPCTSTR szAttrib, LPCTSTR szValue )
{
	// Set attribute in iPos element
	TokenPos token( m_strDoc, m_nFlags );
	if ( iPos && m_nNodeType == MNT_ELEMENT )
		token.nNext = m_aPos[iPos].nStart + 1;
	else if ( iPos == m_iPos && m_nNodeLength && m_nNodeType == MNT_PROCESSING_INSTRUCTION )
		token.nNext = m_nNodeOffset + 2;
	else
		return false;

	// Create insertion text depending on whether attribute already exists
	// Decision: for empty value leaving attrib="" instead of removing attrib
	int nReplace = 0;
	int nInsertAt;
	CString strInsert;
	strInsert += x_ATTRIBQUOTE;
	strInsert += EscapeText( szValue, MNF_ESCAPEQUOTES );
	strInsert += x_ATTRIBQUOTE;
	if ( x_FindAttrib( token, szAttrib ) )
	{
		// Replace value
		nInsertAt = token.nL - ((token.nTokenFlags&MNF_QUOTED)?1:0);
		nReplace = token.Length() + ((token.nTokenFlags&MNF_QUOTED)?2:0);
	}
	else
	{
		// Insert string name value pair
		CString strFormat;
		strFormat = _T(" ");
		strFormat += szAttrib;
		strFormat += _T("=");
		strFormat += strInsert;
		strInsert = strFormat;
		nInsertAt = token.nNext;
	}

	x_DocChange( nInsertAt, nReplace, strInsert );
	int nAdjust = strInsert.GetLength() - nReplace;
	if ( m_nNodeType == MNT_PROCESSING_INSTRUCTION )
	{
		x_AdjustForNode( m_iPosParent, m_iPos, nAdjust );
		m_nNodeLength += nAdjust;
		MARKUP_SETDEBUGSTATE;
		return true;
	}
	m_aPos[iPos].AdjustStartTagLen( nAdjust );
	m_aPos[iPos].nLength += nAdjust;
	x_Adjust( iPos, nAdjust );
	MARKUP_SETDEBUGSTATE;
	return true;
}


bool CMarkup::x_CreateNode( CString& strNode, int nNodeType, LPCTSTR szText )
{
	// Set strNode based on nNodeType and szData
	// Return false if szData would jeopardize well-formed document
	//
	switch ( nNodeType )
	{
	case MNT_PROCESSING_INSTRUCTION:
		strNode = "<?";
		strNode += szText;
		strNode += "?>";
		break;
	case MNT_COMMENT:
		strNode = "<!--";
		strNode += szText;
		strNode += "-->";
		break;
	case MNT_ELEMENT:
		strNode = "<";
		strNode += szText;
		strNode += "/>";
		break;
	case MNT_TEXT:
	case MNT_WHITESPACE:
		strNode = EscapeText( szText );
		break;
	case MNT_DOCUMENT_TYPE:
		strNode = szText;
		break;
	case MNT_LONE_END_TAG:
		return false;
	case MNT_CDATA_SECTION:
		if ( _tcsstr(szText,_T("]]>")) != NULL )
			return false;
		strNode = "<![CDATA[";
		strNode += szText;
		strNode += "]]>";
		break;
	}
	return true;
}

CString CMarkup::x_EncodeCDATASection( LPCTSTR szData )
{
	// Split CDATA Sections if there are any end delimiters
	CString strData = _T("<![CDATA[");
	LPCTSTR pszNextStart = szData;
	LPCTSTR pszEnd = _tcsstr( szData, _T("]]>") );
	while ( pszEnd )
	{
		strData += CString( pszNextStart, (int)(pszEnd - pszNextStart) );
		strData += _T("]]]]><![CDATA[>");
		pszNextStart = pszEnd + 3;
		pszEnd = _tcsstr( pszNextStart, _T("]]>") );
	}
	strData += pszNextStart;
	strData += _T("]]>");
	return strData;
}

bool CMarkup::x_SetData( int iPos, int nValue )
{
	// Convert integer to string
	_TCHAR szVal[25];
	_stprintf( szVal, _T("%d"), nValue );
	return x_SetData( iPos, szVal, 0 );
}

bool CMarkup::x_SetData( int iPos, LPCTSTR szData, int nFlags )
{
	// Set data at specified position
	// if nFlags==1, set content of element to a CDATA Section
	CString strInsert;

	if ( iPos == m_iPos && m_nNodeLength )
	{
		// Not an element
		if ( ! x_CreateNode(strInsert, m_nNodeType, szData) )
			return false;
		x_DocChange( m_nNodeOffset, m_nNodeLength, strInsert );
		x_AdjustForNode( m_iPosParent, iPos, strInsert.GetLength() - m_nNodeLength );
		m_nNodeLength = strInsert.GetLength();
		MARKUP_SETDEBUGSTATE;
		return true;
	}

	// Set data in iPos element
	if ( ! iPos || m_aPos[iPos].iElemChild )
		return false;

	// Build strInsert from szData based on nFlags
	if ( nFlags & MNF_WITHCDATA )
		strInsert = x_EncodeCDATASection( szData );
	else
		strInsert = EscapeText( szData, nFlags );

	// Insert
	NodePos node( MNF_WITHNOLINES|MNF_REPLACE );
	node.strMeta = strInsert;
	int iPosBefore = 0;
	int nReplace = x_InsertNew( iPos, iPosBefore, node );
	int nAdjust = node.strMeta.GetLength() - nReplace;
	x_Adjust( iPos, nAdjust );
	m_aPos[iPos].nLength += nAdjust;
	if ( m_aPos[iPos].nFlags & MNF_ILLDATA )
		m_aPos[iPos].nFlags &= ~MNF_ILLDATA;
	MARKUP_SETDEBUGSTATE;
	return true;
}

CString CMarkup::x_GetData( int iPos ) const
{
	if ( iPos == m_iPos && m_nNodeLength )
	{
		if ( m_nNodeType == MNT_COMMENT )
			return m_strDoc.Mid( m_nNodeOffset+4, m_nNodeLength-7 );
		else if ( m_nNodeType == MNT_PROCESSING_INSTRUCTION )
			return m_strDoc.Mid( m_nNodeOffset+2, m_nNodeLength-4 );
		else if ( m_nNodeType == MNT_CDATA_SECTION )
			return m_strDoc.Mid( m_nNodeOffset+9, m_nNodeLength-12 );
		else if ( m_nNodeType == MNT_TEXT )
			return UnescapeText( &((LPCTSTR)m_strDoc)[m_nNodeOffset], m_nNodeLength );
		else if ( m_nNodeType == MNT_LONE_END_TAG )
			return m_strDoc.Mid( m_nNodeOffset+2, m_nNodeLength-3 );
		else
			return m_strDoc.Mid( m_nNodeOffset, m_nNodeLength );
	}

	// Return a string representing data between start and end tag
	// Return empty string if there are any children elements
	CString strData;
	if ( ! m_aPos[iPos].iElemChild && ! m_aPos[iPos].IsEmptyElement() )
	{
		// Quick scan for any tags inside content
		int nContentLen = m_aPos[iPos].ContentLen();
		int nStartContent = m_aPos[iPos].StartContent();
		LPCTSTR pszContent = &((LPCTSTR)m_strDoc)[nStartContent];
		LPCTSTR pszTag = _tcschr( pszContent, _T('<') );
		if ( pszTag && ((int)(pszTag-pszContent) < nContentLen) )
		{
			// Concatenate all CDATA Sections and text nodes, ignore other nodes
			TokenPos token( m_strDoc, m_nFlags );
			token.nNext = nStartContent;
			NodePos node;
			while ( token.nNext < nStartContent + nContentLen )
			{
				x_ParseNode( token, node );
				if ( node.nNodeType == MNT_TEXT )
					strData += UnescapeText( &token.szDoc[node.nStart], node.nLength );
				else if ( node.nNodeType == MNT_CDATA_SECTION )
					strData += m_strDoc.Mid( node.nStart+9, node.nLength-12 );
			}
		}
		else // no tags
			strData = UnescapeText( &((LPCTSTR)m_strDoc)[nStartContent], nContentLen );
	}
	return strData;
}

CString CMarkup::x_GetElemContent( int iPos ) const
{
	if ( iPos && m_aPos[iPos].ContentLen() )
		return m_strDoc.Mid( m_aPos[iPos].StartContent(), m_aPos[iPos].ContentLen() );
	return _T("");
}

bool CMarkup::x_SetElemContent( LPCTSTR szContent )
{
	// Set data in iPos element only
	if ( ! m_iPos )
		return false;

	if ( m_nNodeLength )
		return false; // not an element

	// Unlink all children
	int iPos = m_iPos;
	int iPosChild = m_aPos[iPos].iElemChild;
	bool bHadChild = (iPosChild != 0);
	while ( iPosChild )
		iPosChild = x_ReleaseSubDoc( iPosChild );
	if ( bHadChild )
		x_CheckSavedPos();

	// Parse content
	bool bWellFormed = true;
	TokenPos token( szContent, m_nFlags );
	int iPosVirtual = x_GetFreePos();
	m_aPos[iPosVirtual].ClearVirtualParent();
	m_aPos[iPosVirtual].SetLevel( m_aPos[iPos].Level() + 1 );
	iPosChild = x_ParseElem( iPosVirtual, token );
	if ( m_aPos[iPosVirtual].nFlags & MNF_ILLFORMED )
		bWellFormed = false;
	m_aPos[iPos].nFlags = (m_aPos[iPos].nFlags & ~MNF_ILLDATA) | (m_aPos[iPosVirtual].nFlags & MNF_ILLDATA);

	// Prepare insert and adjust offsets
	NodePos node( MNF_WITHNOLINES|MNF_REPLACE );
	node.strMeta = szContent;
	int iPosBefore = 0;
	int nReplace = x_InsertNew( iPos, iPosBefore, node );
	
	// Adjust and link in the inserted elements
	x_Adjust( iPosChild, node.nStart );
	m_aPos[iPosChild].nStart += node.nStart;
	m_aPos[iPos].iElemChild = iPosChild;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美va亚洲va| 久久久九九九九| 国产成人午夜视频| 久久99蜜桃精品| 婷婷综合久久一区二区三区| 亚洲欧美日韩国产另类专区| 国产日韩视频一区二区三区| 久久久蜜桃精品| 中文一区二区在线观看| 国产精品欧美经典| 国产精品久久久久久久久免费桃花| 欧美成人午夜电影| 久久一留热品黄| 国产女主播一区| 欧美激情综合在线| 国产精品久久综合| 夜色激情一区二区| 日日摸夜夜添夜夜添国产精品| 石原莉奈在线亚洲三区| 美国毛片一区二区三区| 狠狠色狠狠色综合| 国产.精品.日韩.另类.中文.在线.播放| 国产在线精品视频| 成人午夜私人影院| 国产suv一区二区三区88区| 99视频热这里只有精品免费| 色婷婷av一区二区| 日韩视频一区二区在线观看| 欧美va在线播放| 国产精品久久久一本精品 | 国产一区三区三区| 不卡av免费在线观看| 欧美在线一二三四区| 欧美mv和日韩mv的网站| 亚洲欧美综合在线精品| 久久久久久久久免费| 一区二区三区四区视频精品免费 | 欧美一区二区三区性视频| 欧美xxxxx裸体时装秀| 中文字幕一区二区三中文字幕| 亚洲精品中文在线观看| 日韩电影在线一区| 成人精品小蝌蚪| 欧美一区二区免费视频| 国产精品高潮呻吟| 久久精品国产一区二区三区免费看 | 色综合久久精品| 日韩欧美国产一区在线观看| 国产精品乱码久久久久久| 日日夜夜精品视频天天综合网| 丁香网亚洲国际| 日韩一区二区麻豆国产| 国产女主播在线一区二区| 天天操天天综合网| 色婷婷香蕉在线一区二区| 久久久一区二区三区| 婷婷综合在线观看| 色老综合老女人久久久| 久久精品视频网| 激情综合一区二区三区| 欧美日韩在线不卡| 亚洲女女做受ⅹxx高潮| 国产成人精品一区二区三区四区 | 在线中文字幕一区| 国产亚洲人成网站| 老司机精品视频一区二区三区| 欧美综合亚洲图片综合区| 中文字幕一区二区三区在线不卡 | 99精品欧美一区二区蜜桃免费 | 国产剧情av麻豆香蕉精品| 欧美一卡2卡3卡4卡| 首页国产丝袜综合| 欧美日韩国产免费一区二区| 亚洲国产精品麻豆| 欧美色偷偷大香| 亚洲国产三级在线| 69久久夜色精品国产69蝌蚪网| 亚洲国产cao| 欧美一区二区三区小说| 日本欧美加勒比视频| 日韩一区二区免费在线电影| 日韩高清在线不卡| 欧美大片免费久久精品三p| 蜜桃精品视频在线| 久久女同性恋中文字幕| 久久99精品国产.久久久久久| 日韩精品一区二区三区四区| 久久精品国产网站| 国产亚洲欧洲997久久综合| 国产乱人伦偷精品视频不卡| 欧美极品少妇xxxxⅹ高跟鞋| 成人黄色网址在线观看| 综合网在线视频| 一本大道久久精品懂色aⅴ| 一区二区三区在线影院| 7777精品伊人久久久大香线蕉的 | 久久日韩精品一区二区五区| 国产精品一区二区视频| 国产精品美女久久久久久 | 日韩成人伦理电影在线观看| 日韩免费在线观看| 成人免费视频app| 亚洲精品成a人| 精品免费视频.| 不卡一区中文字幕| 香蕉久久一区二区不卡无毒影院| 日韩视频在线永久播放| 国产精品1区2区| 亚洲一区二区三区在线看| 3d成人动漫网站| 成人深夜福利app| 亚洲高清免费视频| 久久久久青草大香线综合精品| 成人高清视频在线| 日欧美一区二区| 亚洲三级电影网站| 日韩欧美国产一区在线观看| 91麻豆成人久久精品二区三区| 日本一不卡视频| 国产精品久久免费看| 欧美一区二区三区四区久久 | 亚洲香蕉伊在人在线观| 日韩一级二级三级精品视频| 成人av免费在线播放| 日韩综合在线视频| 亚洲精品成人精品456| 精品免费视频.| 欧美福利一区二区| 99久久久久久99| 国产精品综合视频| 午夜久久久久久久久| 综合自拍亚洲综合图不卡区| 精品电影一区二区三区| 精品视频在线免费| 色国产综合视频| 国产曰批免费观看久久久| 日韩在线a电影| 又紧又大又爽精品一区二区| 国产精品亲子乱子伦xxxx裸| 欧美不卡一区二区三区| 欧美一区二区网站| 欧美日韩综合色| 欧美主播一区二区三区美女| 成人黄色小视频| 成人18视频日本| av综合在线播放| 色婷婷亚洲综合| 欧美性受极品xxxx喷水| 一本大道久久a久久综合婷婷| 91天堂素人约啪| 91亚洲精品久久久蜜桃| av中文字幕亚洲| 91小视频免费看| 91丨九色porny丨蝌蚪| 99re这里只有精品6| av成人老司机| 91香蕉视频在线| 欧美亚洲高清一区二区三区不卡| 欧美在线视频日韩| 91电影在线观看| 欧美精选在线播放| 日韩欧美另类在线| 欧美va亚洲va香蕉在线| 国产日韩影视精品| 中文字幕亚洲不卡| 一区二区三区在线播放| 亚洲最大的成人av| 视频一区二区三区在线| 久久精品国产99久久6| 国内精品国产三级国产a久久| 国产成人午夜高潮毛片| 不卡区在线中文字幕| 91蝌蚪porny成人天涯| 欧美人xxxx| 久久久久久亚洲综合影院红桃 | 青青草97国产精品免费观看| 亚洲va欧美va天堂v国产综合| 日韩高清在线不卡| 国产成人av电影免费在线观看| 成人免费看视频| 欧美日免费三级在线| 精品国产三级电影在线观看| 欧美国产日韩亚洲一区| 亚洲午夜视频在线| 国产99精品国产| 91成人免费在线| 欧美精品一区二区三区高清aⅴ| 国产婷婷色一区二区三区| 亚洲激情第一区| 国产精品1024久久| 9色porny自拍视频一区二区| 欧美片在线播放| 中文字幕不卡在线观看| 日本伊人精品一区二区三区观看方式| 精品亚洲欧美一区| 91久久精品一区二区| 久久日韩粉嫩一区二区三区| 亚洲午夜一区二区| 成人av免费在线| 久久综合狠狠综合久久激情 |