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

📄 xml.cpp

📁 离线的RSS阅读器
💻 CPP
📖 第 1 页 / 共 2 页
字号:

CString _getHttpFile(const char* url)
{
	CFile xmlfile;
	
	CInternetSession session;
	CHttpFile *file = NULL; 
	CString str = "";
	try{

		   file = (CHttpFile*)session.OpenURL(url);
		   
	}catch(CInternetException * m_pException){
		   file = NULL;
		   m_pException->m_dwError;
		   m_pException->Delete();
		   session.Close();
		   //MessageBox(NULL,"网络异常",NULL,NULL);
		   return str;
	}

	CString strLine;
	char *pBuff = NULL;
	if(file != NULL){	
		int length = 0;
		try{
			length = file->SeekToEnd();
			file->SeekToBegin();

			pBuff = new char[length+1];
			memset(pBuff,0,length+1);
		   
			char *buff = new char[1028];
			while (int readbyte = file->Read(buff,1024))
			{
				buff[readbyte]='\0';
				
				strcat(pBuff,buff);
				int n = strlen(buff);
				int m = strlen(pBuff);
				memset(buff,0,1024);
				
			}
			delete[] buff;
			str = pBuff;
			delete[] pBuff;
		}
		catch(...){
			while(file->ReadString(strLine) != NULL){
				str += strLine;
		   }
		}
	
	}else{
		return str;

	}
	session.Close();
	file->Close();
	delete file;
	file = NULL;  
	
	return str;
}

CString getHttpFile(const char* url){
	HTTPRequest data;
	CRequest req;
	req.SendRequest(false, url, NULL, &data);

	char *pBuf = NULL;	

	//GetMBCSString(&pBuf, data.message);

	pBuf = new char[strlen(data.message)+1];
	strcpy(pBuf,data.message);

	req.MemBufferFree(&data);
	if (strlen(pBuf)<512)
	{
		delete[] pBuf;
		return _getHttpFile(url);
	}
	else{
		CString str(pBuf);
		delete[] pBuf;
		return str;
	}
}

Channel *XMLGetChannelByURL(char *url){
	char* pbuf=NULL;
	//CString sret=GeHttptFileByproxy(url,"","");
	CString sret = _getHttpFile(url);
	int index = sret.Find("?>",0);
	int length = sret.GetLength();
	char *temp = new char[length+128*2];
	sprintf(temp,"%d",length);
	//AfxMessageBox(temp);
	memset(temp,0,length+128*2);

	char *body = sret.GetBuffer(sret.GetLength());
	if (index>0)
	{
		body = body+index+2;
	}
	
	sprintf(temp,"<?xml version=\"1.0\" encoding=\"utf-16\" ?>%s",body);

	//sret.ReleaseBuffer();
	int gbkIndex = sret.Find("GBK");
	if (gbkIndex<0)
	{
		gbkIndex = sret.Find("gbk");
	}
	int gb2312Index = sret.Find("gb2312");
	if (gb2312Index<0)
	{
		gb2312Index = sret.Find("GB2312");
	}
	if (gbkIndex<sret.Find("?>")&&gbkIndex>0){
		pbuf = temp;
	}
	else if (gb2312Index<sret.Find("?>")&&gb2312Index>0)
	{
		pbuf = temp;
	}
	else{
		GetMBCSString(&pbuf,temp);
		delete[] temp;
	}
	CString name;
	ItemList* item=parseXML(pbuf,name);
	Channel *channel = new Channel(url,"",(LPSTR)(LPCSTR)name,item);
	
	delete []pbuf;
	return channel;
}

MyTreeNode* _OPML2TreeNode(MSXML2::IXMLDOMNodePtr pxmlNode){
	MyTreeNode *root = NULL;
	MSXML2::IXMLDOMNodeListPtr childs = pxmlNode->GetchildNodes();
	int childCount = childs->Getlength();
	MSXML2::IXMLDOMNamedNodeMapPtr map = pxmlNode->Getattributes();
	if (map->getNamedItem(_bstr_t("xmlUrl"))==NULL)
	{
		//有子节点,为目录
		MSXML2::IXMLDOMNamedNodeMapPtr pattr = pxmlNode->Getattributes();
		MSXML2::IXMLDOMNodePtr pTitle = pattr->getNamedItem(_bstr_t("title"));
		_bstr_t title = pTitle->GetnodeValue();
		
		char *pcTitle = _com_util::ConvertBSTRToString(title);
		root = new DirNode(pcTitle,MyTreeNode::nextID++);
// 		if(pTitle!=NULL)
// 		{
// 			pTitle->Release();
// 		}

		DirNode *dir = (DirNode*)(root);
		if (pxmlNode->firstChild==NULL)
		{
			return dir;
		}
		MSXML2::IXMLDOMNodePtr pChild = pxmlNode->firstChild;
		MyTreeNode * child = _OPML2TreeNode(pChild);
		dir->firstChild = child;

		MSXML2::IXMLDOMNodePtr sibling = pChild->nextSibling;
		while (sibling)
		{
			MyTreeNode *temp = _OPML2TreeNode(sibling);
			child->nextSubling = temp;
			child = temp;
			sibling = sibling->nextSibling;
		}

	}
	else {
		MSXML2::IXMLDOMNamedNodeMapPtr pattr = pxmlNode->Getattributes();
		MSXML2::IXMLDOMNodePtr pTitle = pattr->getNamedItem(_bstr_t("title"));
		_bstr_t title = pTitle->GetnodeValue();		
		char *pcTitle = _com_util::ConvertBSTRToString(title);
// 		if(pTitle!=NULL)
// 		{
// 			pTitle->Release();
// 		}
	
		MSXML2::IXMLDOMNodePtr pUrl = pattr->getNamedItem(_bstr_t("xmlUrl"));
		_bstr_t url = pUrl->GetnodeValue();		
		char *pcUrl = _com_util::ConvertBSTRToString(url);
// 		if(pUrl!=NULL)
// 		{
// 			pUrl->Release();
// 		}

// 		MSXML2::IXMLDOMNodePtr pTime = pattr->getNamedItem(_bstr_t("created"));
// 		_bstr_t time = pTime->GetnodeValue();		
// 		char *pcTime = _com_util::ConvertBSTRToString(time);

		root = new ChannelNode(pcTitle,pcUrl,NULL,MyTreeNode::nextID++);
	}

	return root;

}

MyTreeNode *XMLLoadOPML(char *filename){
	MSXML2::IXMLDOMDocument2Ptr pDoc=NULL;
    MSXML2::IXMLDOMElementPtr pRoot=NULL;
	HRESULT hr;
	hr= CoInitialize(NULL);
	hr=pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument26));
	 if(!SUCCEEDED(hr)) 
	{    
      printf("fail!");
	}

	 pDoc->put_async(VARIANT_FALSE);
	pDoc->put_validateOnParse(VARIANT_FALSE);
	pDoc->put_resolveExternals(VARIANT_FALSE);
	pDoc->put_preserveWhiteSpace(VARIANT_FALSE);	
	
	//pDoc->loadXML(_bstr_t(pbuf));
	if (pDoc->load(_variant_t(filename))!=VARIANT_TRUE)
	{
		return NULL;
	}
	pRoot=pDoc->documentElement;
	MSXML2::IXMLDOMNodePtr pBody = pRoot->selectSingleNode(_bstr_t("body"));
	MyTreeNode temp("",-1);
	MyTreeNode *root = NULL;
	//MSXML2::IXMLDOMNodeListPtr ptr = pBody->GetchildNodes();
	if (pBody->firstChild!=NULL)
	{
		root = _OPML2TreeNode(pBody->firstChild);
		MyTreeNode *nextSibling = root;
		MSXML2::IXMLDOMNodePtr sibling = pBody->firstChild->nextSibling;
		while (sibling)
		{
			MyTreeNode *temp = _OPML2TreeNode(sibling);
			nextSibling->nextSubling = temp;
			nextSibling = nextSibling->nextSubling;
			sibling = sibling->nextSibling;
		}
	}

	
	pDoc=NULL;
	pRoot = NULL;
	return root;
}

MSXML2::IXMLDOMElementPtr _XMLsaveOPML(MSXML2::IXMLDOMDocument2Ptr pdoc,MyTreeNode *root){
	if (root->type)
	{
		ChannelNode *data = (ChannelNode*)root;
		MSXML2::IXMLDOMElementPtr presult = pdoc->createElement(_bstr_t("outline"));
		presult->setAttribute(_bstr_t("title"),data->name);
		presult->setAttribute(_bstr_t("text"),data->name);
		presult->setAttribute(_bstr_t("type"),"rss");
		presult->setAttribute(_bstr_t("xmlUrl"),data->url);
		return presult;
	}
	else{
		DirNode *data = (DirNode*)root;
		MSXML2::IXMLDOMElementPtr presult = pdoc->createElement(_bstr_t("outline"));
		presult->setAttribute(_bstr_t("title"),data->name);
		MyTreeNode *child = data->firstChild;
		while (child)
		{
			MSXML2::IXMLDOMElementPtr temp = _XMLsaveOPML(pdoc,child);
			presult->appendChild(temp);
			child = child->nextSubling;
		}
		return presult;
	}
}

void XMLsaveOPML(char *filename,MyTreeNode *root){
	MSXML2::IXMLDOMDocument2Ptr pDoc=NULL;
	HRESULT hr= CoInitialize(NULL);
	hr=pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument26));
	 if(!SUCCEEDED(hr)) 
	{    
      printf("fail!");
	}

	 MSXML2::IXMLDOMProcessingInstructionPtr pPi = NULL;
	 pPi = pDoc->createProcessingInstruction("xml","version='1.0' encoding='utf-8'");
	 pDoc->appendChild(pPi);
	 MSXML2::IXMLDOMElementPtr proot = pDoc->createElement(_bstr_t("opml"));
	 //MSXML2::IXMLDOMNodePtr proot = pDoc->createNode(NODE_DOCUMENT,_bstr_t("opml"),_bstr_t(""));
	 proot->setAttribute(_bstr_t("version"),"1.1");
	 pDoc->appendChild(proot);
	 MSXML2::IXMLDOMElementPtr pHead = pDoc->createElement(_bstr_t("head"));
	 MSXML2::IXMLDOMElementPtr pTitle = pDoc->createElement(_bstr_t("title"));
	 MSXML2::IXMLDOMNodePtr pText = pDoc->createTextNode(_bstr_t("DiamondReader"));
	 pTitle->appendChild(pText);
	 pHead->appendChild(pTitle);
	 proot->appendChild(pHead);

	 MSXML2::IXMLDOMElementPtr pBody = pDoc->createElement(_bstr_t("body"));
	
	 while (root)
	 {
		MSXML2::IXMLDOMElementPtr presult = _XMLsaveOPML(pDoc,root);
		pBody->appendChild(presult);
		root = root->nextSubling;
	 }
	 proot->appendChild(pBody);
	 pDoc->save(filename);
	 
}

⌨️ 快捷键说明

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