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

📄 xml.cpp

📁 mysee网络直播源代码Mysee Lite是Mysee独立研发的网络视频流媒体播放系统。在应有了P2P技术和一系列先进流媒体技术之后
💻 CPP
字号:
/*
 *  Openmysee
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */
#include "stdafx.h"
#include "xml.h"
//xml函数库--------------------------------


BOOL CXML::InitXml( )
{
	// Initialize COM CoUninitialize
	::CoInitialize(NULL);

	HRESULT hr = m_plDomDocument.CreateInstance(MSXML::CLSID_DOMDocument);
	if (FAILED(hr))
	{
		_com_error er(hr);
		AfxMessageBox(er.ErrorMessage());
	//	EndDialog(1);
		return 0;//0为失败
	}
	HRESULT hr1 = m_plUrlDomDocument.CreateInstance(MSXML::CLSID_DOMDocument);
	if (FAILED(hr1))
	{
		_com_error er(hr1);
		AfxMessageBox(er.ErrorMessage());
	//	EndDialog(1);
		return 0;//0为失败
	}
	m_pcurnode = NULL;
	m_pnodelist=NULL;
	m_pDocRoot=NULL;
	m_len = 0;
	return 1;
}
void CXML::unInitXml( )
{
	while(!m_nodeliststack.empty())
		m_nodeliststack.pop();

	if(m_plDomDocument != NULL)
	{
//		m_plDomDocument->Release();
		m_plDomDocument = NULL;
	}
	if(m_plUrlDomDocument != NULL)
	{
//		m_plUrlDomDocument->Release();
		m_plUrlDomDocument = NULL;
	}
	if(m_pnodelist != NULL)
	{
//		m_pnodelist->Release();
		m_pnodelist = NULL;
	}
	if(m_pDocRoot != NULL)
	{
//		m_pDocRoot->Release();
		m_pDocRoot = NULL;
	}
	::CoUninitialize();
}


BOOL CXML::OpenXml(const std::string& strdata )
{

	// convert xml file name string to something COM can handle (BSTR)
	// specify xml file name
	_bstr_t bstrdata(strdata.c_str());
//	bstrdata = strdata.AllocSysString();	
		// call the IXMLDOMDocumentPtr's load function to load the XML document
	variant_t vResult;
	m_plDomDocument->put_async(0);//同步传输方式
	vResult = m_plDomDocument->loadXML(bstrdata);
//  vResult = m_plDomDocument->load("d:\\program.xml");

	if (((bool)vResult) == TRUE) // success!
	{
		m_pDocRoot = m_plDomDocument->documentElement;

//		bool ret = m_pDocRoot->hasChildNodes();
	}
	else
	{
		//AfxMessageBox("Document FAILED to load!");
		return FALSE;
	}
	
	return TRUE;
}
//返回指定节点的数目
long CXML::GetNodelistNum (  )
{
	//IXMLDOMNodeListPtr pnodelist = m_pDocRoot->selectNodes(nodename);
	return m_pnodelist->Getlength();
}
//设定符合条件的节点列表
long CXML::SetNodelist ( LPCTSTR nodename )
{
	_bstr_t _nodename(nodename);
	m_pnodelist = m_pDocRoot->selectNodes(_nodename.GetBSTR());
//	m_pnodelist = m_pDocRoot->selectNodes(nodename);
	if (m_pnodelist==NULL) {
		return 0;
	}
	return m_len = m_pnodelist->Getlength();

}

BOOL	CXML::ToNextNode()
{
	if(m_pnodelist == NULL)
		return FALSE;
	m_pcurnode = m_pnodelist->nextNode();
	if(m_pcurnode == NULL)
		return FALSE;
	else
		return TRUE;
}

BOOL	CXML::ToNode(long l_index)
{
	if(l_index >= m_len)
		return FALSE;

	m_pnodelist->reset();
	for (int i=0; i<m_len ; i++) //遍历节点
	{
		m_pcurnode = m_pnodelist->nextNode();
		if (m_pcurnode==NULL)
		{
			return FALSE;
		}
		if(i == l_index)
			return TRUE;
	}
	return FALSE;
}

BOOL	CXML::ToSubNodeList(LPCTSTR nodename)
{
	if(m_pcurnode == NULL)
		return FALSE;

	_bstr_t _nodename(nodename);
	MSXML::IXMLDOMNodeListPtr tpnodelist = m_pcurnode->selectNodes(_nodename.GetBSTR());
	if(tpnodelist == NULL || tpnodelist->Getlength() == 0)
		return FALSE;

	m_nodeliststack.push(m_pnodelist);
	m_pnodelist = tpnodelist;
    m_curnodestack.push(m_pcurnode);

	return TRUE;
}

BOOL	CXML::BackParentNodeList()
{
	if(m_nodeliststack.empty())
		return FALSE;
	m_pnodelist = m_nodeliststack.top();
	m_nodeliststack.pop();
    m_pcurnode = m_curnodestack.top();
    m_curnodestack.pop();
	return TRUE;
}


BOOL	CXML::GetCurNodeAttrValue(mystring&	strAttrValue, LPCTSTR attrname)
{
	if(m_pcurnode == NULL)
		return FALSE;

	
	MSXML::IXMLDOMNodePtr pAttrItem;
	MSXML::IXMLDOMNamedNodeMapPtr pAttrs;

	m_pcurnode->get_attributes(&pAttrs);
	if (pAttrs==NULL)
		return FALSE;

	_bstr_t _attrname(attrname);
	pAttrItem = pAttrs->getNamedItem(_attrname.GetBSTR());//attrname="Name"
	if(pAttrItem == NULL)
		return FALSE;

	strAttrValue  = (LPCTSTR)(_bstr_t)pAttrItem->nodeTypedValue;
	return TRUE;
	
}

//根据名称查找指定的结点:!!!!!!!暂时未用
LPCTSTR CXML::GetNodeValue ( LPCTSTR name )
{
//	CString strTemp;
	long nCount ;
	MSXML::IXMLDOMNodePtr pAttrItem;
	MSXML::IXMLDOMElementPtr pRequestTypeAttr;
	MSXML::IXMLDOMNamedNodeMapPtr pAttrs = NULL;
	MSXML::IXMLDOMNodeListPtr pnodelist = m_pDocRoot->selectNodes(name);

	long num = pnodelist->Getlength();
	//pnodelist->item(long index);

	for (int i=0; i<m_len ; i++) //遍历节点
	{
		pAttrItem = pnodelist->nextNode();
		pAttrItem->get_attributes(&pAttrs);
		if (pAttrs==NULL)
		{
			return NULL;
		}
		
		pAttrs->get_length(&nCount);
		for(int i = 0 ; i < nCount ; i++)
		{                 
			//pAttrs->get_item(i,&pAttrItem);
			pAttrItem = pAttrs->getNamedItem("Name");
			//我们可以通过函数get_nodeName,get_nodeTypedValue得到属性名和属性值
			//也可以直接得到
//			CString strAttrName   = (LPCTSTR)(_bstr_t)pAttrItem->nodeName;
//			CString strAttrValue  = (LPCTSTR)(_bstr_t)pAttrItem->nodeTypedValue;
		}
	}
	return NULL;
}

//根据属性名称和属性值查询对应节点,返回值为节点的索引号,1为第一号
long  CXML::SearchByAttrValue ( LPCTSTR attrname, LPCTSTR attrvalue )
{
	long l_index=0;
//	CString strTemp;
	mystring strAttrValue  =_T("");
//	long nCount ;
	MSXML::IXMLDOMNodePtr pAttrItem;
	MSXML::IXMLDOMElementPtr pRequestTypeAttr;
	MSXML::IXMLDOMNamedNodeMapPtr pAttrs = NULL;
//	IXMLDOMNodeListPtr pnodelist = m_pDocRoot->selectNodes(nodename);
//	long num = pnodelist->Getlength();
	//pAttrItem = pnodelist->item(l_index);
	m_pnodelist->reset();
	for (int i=0; i<m_len ; i++) //遍历节点到指定index节点
	{
		pAttrItem = m_pnodelist->nextNode();
		//取得节点的属性值
		pAttrItem->get_attributes(&pAttrs);
		if (pAttrs==NULL)
		{
			return -1;
		}
		pAttrItem = pAttrs->getNamedItem(attrname);//attrname="Name"
		mystring strAttrName   = (LPCTSTR)(_bstr_t)pAttrItem->nodeName;
		strAttrValue  = (LPCTSTR)(_bstr_t)pAttrItem->nodeTypedValue;
		if (strAttrValue==attrvalue) {
			l_index=i+1;
			break;
		}
	}

/*
	pAttrs->get_length(&nCount);
	for(int i = 0 ; i < nCount ; i++)
	{                 
		//pAttrs->get_item(i,&pAttrItem);
		pAttrItem = pAttrs->getNamedItem(attrname);//attrname="Name"
		//我们可以通过函数get_nodeName,get_nodeTypedValue得到属性名和属性值
		//也可以直接得到
		CString strAttrName   = (LPCTSTR)(_bstr_t)pAttrItem->nodeName;
		CString strAttrValue  = (LPCTSTR)(_bstr_t)pAttrItem->nodeTypedValue;
	}*/

	return l_index;
}
//获得根据索引号取得节点属性值
BOOL CXML::GetNodeAttrValue (mystring& strAttrValue, long l_index, LPCTSTR nodename, LPCTSTR attrname )
{
//	CString strTemp;
	strAttrValue  =_T("");
//	long nCount ;
	MSXML::IXMLDOMNodePtr pAttrItem;
	MSXML::IXMLDOMElementPtr pRequestTypeAttr;
	MSXML::IXMLDOMNamedNodeMapPtr pAttrs = NULL;
	MSXML::IXMLDOMNodeListPtr pnodelist = m_pDocRoot->selectNodes(nodename);
//	long num = pnodelist->Getlength();
	//pAttrItem = pnodelist->item(l_index);
	//m_pnodelist->reset();
	for (int i=0; i<=l_index ; i++) //遍历节点到指定index节点
	{
		pAttrItem = pnodelist->nextNode();
	}
	//取得节点的属性值
	pAttrItem->get_attributes(&pAttrs);
	if (pAttrs==NULL)
	{
		return FALSE;
	}
	

	pAttrItem = pAttrs->getNamedItem(attrname);//attrname="Name"
	mystring strAttrName   = (LPCTSTR)(_bstr_t)pAttrItem->nodeName;
	strAttrValue  = (LPCTSTR)(_bstr_t)pAttrItem->nodeTypedValue;
/*
	pAttrs->get_length(&nCount);
	for(int i = 0 ; i < nCount ; i++)
	{                 
		//pAttrs->get_item(i,&pAttrItem);
		pAttrItem = pAttrs->getNamedItem(attrname);//attrname="Name"
		//我们可以通过函数get_nodeName,get_nodeTypedValue得到属性名和属性值
		//也可以直接得到
		CString strAttrName   = (LPCTSTR)(_bstr_t)pAttrItem->nodeName;
		CString strAttrValue  = (LPCTSTR)(_bstr_t)pAttrItem->nodeTypedValue;
	}*/

	return TRUE;
}

⌨️ 快捷键说明

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