//------------------------------------------
bool RssTreeView::LoadXmlToTree(LPCWSTR xmlFileName)
{
if(PathFileExists(xmlFileName) == TRUE)
{
if ( SUCCEEDED(CoInitialize(NULL)) )
{
MSXML2::IXMLDOMDocument *pDoc;
if ( SUCCEEDED (CoCreateInstance(MSXML2::CLSID_DOMDocument,
NULL,
CLSCTX_INPROC_SERVER,
MSXML2::IID_IXMLDOMDocument,
reinterpret_cast<void**>(&pDoc))))
{
//
// Tell the "doc" that we're not going to load asynchronously.
//
if ( SUCCEEDED(pDoc->put_async(VARIANT_FALSE)) )
{
CComVariant vFile(RssDefaultNewsPath);
VARIANT_BOOL vBool;
pDoc->load(vFile,&vBool);
if ( vBool == VARIANT_TRUE )
{
MSXML2::IXMLDOMNodePtr pRootNode;
pDoc->selectSingleNode(_T("root"), &pRootNode); //取得根節點
if(pRootNode == NULL)
return false;
BSTR sRoot;
pRootNode->get_nodeName(&sRoot);
HTREEITEM root = GetTreeCtrl().InsertItem(sRoot, GetTreeCtrl().GetRootItem()); //加入根節點
XmlNodeToTreeNode(root, pRootNode);
pRootNode = NULL;
}
else
ManageDB::CheckLoad(pDoc);
}
pDoc->Release();
pDoc = NULL;
}
CoUninitialize();
}
return true;
}
else
return false;
}
void RssTreeView::XmlNodeToTreeNode(HTREEITEM parentItem, MSXML2::IXMLDOMNodePtr pXmlNode)
{
BSTR nodeType;
MSXML2::IXMLDOMNodeListPtr pXMLNodeList;
long count;
BSTR sNode;
pXmlNode->get_nodeTypeString(&nodeType);
if(!wcscmp(nodeType, _T("text"))) //NODE類型涵義請查MSDN
return;
pXmlNode->get_childNodes(&pXMLNodeList);
pXMLNodeList->get_length(&count); //子節點個數
if(count==0)
{
//沒有子節點,則設置父節點名
pXmlNode->get_nodeName(&sNode);
GetTreeCtrl().SetItemText(parentItem, sNode);
return;
}
for(int i=0; i<count; i++)
{
MSXML2::IXMLDOMNodePtr childNode;
pXMLNodeList->get_item(i, &childNode);
HTREEITEM subItem;
childNode->get_nodeTypeString(&nodeType);
if(!wcscmp(nodeType, _T("text")))
{
//是text,加節點值
childNode->get_text(&sNode);
subItem = GetTreeCtrl().InsertItem(sNode, parentItem);
}
else
{
//非text,加節點名
childNode->get_nodeName(&sNode);
subItem = GetTreeCtrl().InsertItem(sNode, parentItem);
//若是沒有值的非葉子節點,就加一個空子值
VARIANT_BOOL hasChild;
childNode->hasChildNodes(&hasChild);
if(sNode && wcslen(sNode) && !hasChild)
GetTreeCtrl().InsertItem(_T(""), subItem);
}
XmlNodeToTreeNode(subItem, childNode); //遞迴子節點
}
}
bool RssTreeView::SaveTreeToXml(LPCWSTR xmlFileName)
{
CoInitialize(NULL);
MSXML2::IXMLDOMDocument2Ptr pXMLDom;
HRESULT hr = pXMLDom.CreateInstance(__uuidof(DOMDocument40));
if(FAILED(hr))
{
return FALSE;
}
pXMLDom->put_async(VARIANT_FALSE); // default-true
//加入頭訊息
MSXML2::IXMLDOMProcessingInstructionPtr pPI = NULL;
pXMLDom->createProcessingInstruction(_T("xml"), _T("version='1.0' encoding='unicode'"), &pPI);
_variant_t vNullVal;
vNullVal.vt = VT_NULL;
MSXML2::IXMLDOMNodePtr tmpNode;
pXMLDom->insertBefore(pPI, vNullVal, &tmpNode);
HTREEITEM rootItem = GetTreeCtrl().GetRootItem();
//將樹的根加入dom
MSXML2::IXMLDOMNodePtr pRootNode;
pXMLDom->createNode(_variant_t((short)MSXML2::NODE_ELEMENT),
_bstr_t(GetTreeCtrl().GetItemText(rootItem)),
_bstr_t(_T("")),
&pRootNode);
pXMLDom->appendChild(pRootNode, &tmpNode);
TreeNodeToXmlNode(rootItem, pXMLDom, pRootNode);
pXMLDom->save(_variant_t(xmlFileName));
CoUninitialize();
return TRUE;
}
void RssTreeView::TreeNodeToXmlNode(HTREEITEM parentItem, MSXML2::IXMLDOMDocument2Ptr pXMLDom, MSXML2::IXMLDOMNodePtr pXmlNode)
{
if(!GetTreeCtrl().ItemHasChildren(parentItem))
{
return;
}
MSXML2::IXMLDOMNodePtr pChildNode;
HTREEITEM hChildItem = GetTreeCtrl().GetChildItem(parentItem);//得到parentItem下所有子節點
while (hChildItem != NULL)
{
CString szText = GetTreeCtrl().GetItemText(hChildItem);
if(!GetTreeCtrl().ItemHasChildren(hChildItem)) //子為葉子
{
MSXML2::IXMLDOMTextPtr pText;
pXMLDom->createTextNode(_bstr_t(szText), &pText);
pXmlNode->appendChild(pText, &pChildNode); //puttext
}
else //子又有子
{
pXMLDom->createNode(_variant_t((short)MSXML2::NODE_ELEMENT), _bstr_t(_bstr_t(szText)), _bstr_t(_T("")), &pChildNode);
MSXML2::IXMLDOMNodePtr tmpNode;
pXmlNode->appendChild(pChildNode, &tmpNode);
TreeNodeToXmlNode(hChildItem, pXMLDom, pChildNode); //遞迴
}
hChildItem = GetTreeCtrl().GetNextItem(hChildItem, TVGN_NEXT);
}
}
留言列表