CConfigXmlFile02.cpp

来源:互联网 发布:mac文明5 少阿尔 编辑:程序博客网 时间:2024/05/17 02:51

#include "stdafx.h"
#include "ConfigXmlFile02.h"

#import <msxml6.dll> // raw_interfaces_only,named_guids
using namespace MSXML2;


CConfigXmlFile02::CConfigXmlFile02(void)
{
}

CConfigXmlFile02::CConfigXmlFile02(CString path)
{
 m_filepath = path;
 InitDoc();
}

CConfigXmlFile02::~CConfigXmlFile02(void)
{
}


bool CConfigXmlFile02::InitDoc(void)
{
 //read inf.xml
 HRESULT hResult;
 //  Create the COM DOM Document object

 hResult = CoInitialize(NULL);
 hResult = m_spReadPrjDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));  
 if FAILED(hResult)
 {
  m_spReadPrjDoc=NULL;
  return false;
 }
 m_spReadPrjDoc->async =  VARIANT_FALSE;
 hResult = m_spReadPrjDoc->load((_variant_t)m_filepath);
 if (hResult != VARIANT_TRUE)
 {
  m_spReadPrjDoc=NULL;
  return false;
 } 

 return true;
}

CString CConfigXmlFile02::GetNodeText(LPCTSTR lpszItem)
{
 // 返回以秒为单位
 USES_CONVERSION;
 CString strItem(lpszItem);
 BSTR bstrItem = ::_com_util::ConvertStringToBSTR(T2A(strItem.GetBuffer(0)));

 // read content and attribute
 MSXML2::IXMLDOMNodePtr     spNode;
 if(m_spReadPrjDoc)
 { 
  BSTR  bstrContent;
  spNode = m_spReadPrjDoc->selectSingleNode(bstrItem);
  spNode->get_text(&bstrContent);
  CString Propath(::_com_util::ConvertBSTRToString(bstrContent));
  return Propath;
 } 
 else
 {
  return _T("");
 }
}

BOOL CConfigXmlFile02::SetNodeText(LPCTSTR lpszItem, LPCTSTR lpszText)
{
 // 返回以秒为单位
 USES_CONVERSION;
 CString strItem(lpszItem);
 BSTR bstrItem = ::_com_util::ConvertStringToBSTR(T2A(strItem.GetBuffer(0)));

 // read content and attribute
 MSXML2::IXMLDOMNodePtr     spNode;
 if(m_spReadPrjDoc)
 { 
  BSTR  bstrContent = ::_com_util::ConvertStringToBSTR(T2A(lpszText));

  spNode = m_spReadPrjDoc->selectSingleNode(bstrItem);
  spNode->put_text(bstrContent);


  m_spReadPrjDoc->save((_variant_t)m_filepath);//节点处理函数

  return TRUE;
 } 
 else
 {
  return FALSE;
 }
}

BOOL CConfigXmlFile02::SetNodeInt(LPCTSTR lpszItem, int nData)
{
 CString sData;
 sData.Format(_T("%d"), nData);

 return SetNodeText(lpszItem, (LPCTSTR)sData);
}

int CConfigXmlFile02::GetNodeChildNoteCount(LPCTSTR lpszItem)
{
 USES_CONVERSION;
 CString strItem(lpszItem);
 BSTR bstrItem = ::_com_util::ConvertStringToBSTR(T2A(strItem.GetBuffer(0)));

 // read content and attribute
 MSXML2::IXMLDOMNodePtr     spNode;
 if(m_spReadPrjDoc)
 { 
  spNode = m_spReadPrjDoc->selectSingleNode(bstrItem);

  MSXML2::IXMLDOMNodeListPtr spGroupsList=spNode->childNodes;
  if(spGroupsList)
  {
   int lListLength=spGroupsList->Getlength();
   return lListLength;
  }
  else
  {
   return 0;
  }
 } 
 else
 {
  return 0;
 }  

 return 0;
}


INT CConfigXmlFile02::GetNodeInt(LPCTSTR lpszItem)
{
 CString strContent = GetNodeText(lpszItem);
 if (strContent==_T(""))
  return 0;
 else
 {
  INT iContent = _ttoi(strContent.GetBuffer(0));
  return iContent;
 }
}

INT CConfigXmlFile02::GetNodeRGB(LPCTSTR lpszItem)
{
 CString strItem(lpszItem);
 CString strRItem = strItem + _T("//red");
 CString strGItem = strItem + _T("//green");
 CString strBItem = strItem + _T("//blue");

 int r,g,b;
 r = GetNodeInt(strRItem);
 g = GetNodeInt(strGItem);
 b = GetNodeInt(strBItem);

 return RGB(r, g, b);
}

int CConfigXmlFile02::GetNodeAttTextArr(LPCTSTR lpszItem, LPCTSTR lpszAtt, vector<CString> vecData)
{
 USES_CONVERSION;

 CString strItem(lpszItem);
 CString strAttributeName(lpszAtt);

 BSTR bstrItem = ::_com_util::ConvertStringToBSTR(T2A(strItem.GetBuffer(0)));

 // read content and attribute
 MSXML2::IXMLDOMNodePtr     spNode;
 if(m_spReadPrjDoc)
 { 
  BSTR  bstrContent;
  spNode = m_spReadPrjDoc->selectSingleNode(bstrItem);
  if(spNode)
  {
   MSXML2::IXMLDOMNodeListPtr spGroupsList;
   spGroupsList=spNode->childNodes;
   if(spGroupsList)
   {
    int lListLength=spGroupsList->Getlength();
    UINT max = (UINT)lListLength;
    for (UINT i=0;i<max;i++)
    {
     MSXML2::IXMLDOMNodePtr subnode = NULL;
     spGroupsList->get_item(i, &subnode);

     if (subnode)
     {
      // attribute
      VARIANT varValue;
      MSXML2::IXMLDOMNamedNodeMapPtr attributeMap = NULL;
      
      subnode->get_attributes(&attributeMap);
      MSXML2::IXMLDOMNodePtr pIXMLDOMNode = attributeMap->getNamedItem(strAttributeName.AllocSysString());
      pIXMLDOMNode->get_nodeValue(&varValue);

      CString AttContent(::_com_util::ConvertBSTRToString(varValue.bstrVal));
      vecData.push_back(AttContent);
     }
    }

    return max;
   }
  }

  return 0;
 } 
 else
 {
  return 0;
 }
}

int CConfigXmlFile02::GetNodeTextArr(LPCTSTR lpszItem, LPCTSTR lpszAtt, vector<CString> &vecData)
{
 USES_CONVERSION;

 CString strItem(lpszItem);
 CString strAttributeName(lpszAtt);

 BSTR bstrItem = ::_com_util::ConvertStringToBSTR(T2A(strItem.GetBuffer(0)));

 // read content and attribute
 MSXML2::IXMLDOMElementPtr spElem;
 MSXML2::IXMLDOMNodePtr spParentNode;
 MSXML2::IXMLDOMNodePtr  spNode;
 if(m_spReadPrjDoc)
 { 
  BSTR  bstrContent;
  spNode = m_spReadPrjDoc->selectSingleNode(bstrItem);
  if(spNode)
  {
   MSXML2::IXMLDOMNodeListPtr spGroupsList;
   spGroupsList=spNode->childNodes;

   
   if(spGroupsList)
   {
    // read
    vecData.clear();
    int lListLength=spGroupsList->Getlength();
    for (int i=0 ;i<lListLength ;i++)
    {
     MSXML2::IXMLDOMNodePtr subnode = NULL;
     spGroupsList->get_item(i, &subnode);
     subnode->get_text(&bstrContent);

     CString Content(::_com_util::ConvertBSTRToString(bstrContent));
     vecData.push_back(Content);
    }

    return lListLength;
   }
  }

  return 0;
 } 
 else
 {
  return 0;
 }
}

int CConfigXmlFile02::GetNodeIntArr(LPCTSTR lpszItem, LPCTSTR lpszAtt, vector<int> &vecData)
{
 vecData.clear();

 vector<CString> vecString;
 int res = GetNodeTextArr( lpszItem, lpszAtt, vecString);
 for (int i=0; i<vecString.size(); i++)
 {
  CString stemp = vecString.at(i);
  int ntemp = _ttoi(stemp.GetBuffer(0));
  vecData.push_back(ntemp);
 }

 return res;

}
int CConfigXmlFile02::SetNodeTextArr(LPCTSTR lpszItem, LPCTSTR lpszSubItem, vector<CString> vecData)
{
 USES_CONVERSION;

 CString strItem(lpszItem);
 //CString strAttributeName(lpszSubItem);

 BSTR bstrItem = ::_com_util::ConvertStringToBSTR(T2A(strItem.GetBuffer(0)));

 // read content and attribute
 MSXML2::IXMLDOMElementPtr spElem;
 MSXML2::IXMLDOMNodePtr spParentNode;
 MSXML2::IXMLDOMNodePtr  spNode;
 if(m_spReadPrjDoc)
 { 
  BSTR  bstrContent;
  spNode = m_spReadPrjDoc->selectSingleNode(bstrItem);
  if(spNode)
  {
   MSXML2::IXMLDOMNodeListPtr spGroupsList;
   spGroupsList=spNode->childNodes;

   if(spGroupsList)
   {
    // clear node
    int lListLength=spGroupsList->Getlength();
    for (int i=lListLength-1;i>=0;i--)
    {
     MSXML2::IXMLDOMNodePtr subnode = NULL;
     spGroupsList->get_item(i, &subnode);

     spNode->removeChild(subnode);
    }

    // add item
    for (int i=0; i<vecData.size(); i++)
    {
     CString strNodeName;
     CString strNodeValue = vecData.at(i);
     strNodeName.Format( _T("%s%d"), lpszSubItem, i);

     spElem = m_spReadPrjDoc->createElement(strNodeName.AllocSysString());
     spElem->text = strNodeValue.AllocSysString();
     HRESULT hResult;
     hResult = spNode->appendChild(spElem);
     if FAILED(hResult)
     {     
      return 5; //插入失败
     }
    }

    m_spReadPrjDoc->save((_variant_t)m_filepath);//节点处理函数

    return vecData.size();
   }
  }

  return 0;
 } 
 else
 {
  return 0;
 }
}

int CConfigXmlFile02::RemoveChildNode(void)
{
 return 0;
}