📄 xml.cpp
字号:
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 + -