close

//------------------------------------------

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);
 }

   

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 freestyler 的頭像
    freestyler

    Everything Will Flow

    freestyler 發表在 痞客邦 留言(0) 人氣()