首先程序啓動自動加載一張默認的dwg,而後註冊導出命令node
這裏我放了一張測試用的dwg作數據:https://www.jianguoyun.com/p/DaZOQuAQ-pqcBhi7sTQ數組
這裏是初版本,後期又改進了一個版本:http://www.javashuo.com/article/p-njukprnq-em.html緩存
acrxEntryPoint.cpp數據結構
//該函數會在程序啓動後自動執行 virtual AcRx::AppRetCode On_kLoadDwgMsg(void * pkt) { AcRx::AppRetCode retCode =AcRxArxApp::On_kLoadDwgMsg (pkt) ; CDwgDataToXml::OnLoadDWG(); return (retCode) ; } static void HHCDwgPt2XmlApp(void) { CDwgDataToXml::Inlet(); } //註冊命令 ACED_ARXCOMMAND_ENTRY_AUTO(CDwgPt2XmlApp, HH, CDwgPt2XmlApp, HHDCXML, ACRX_CMD_TRANSPARENT, NULL)
具體實現:app
DwgDataToXml.h函數
#pragma once #include <vector> #include "PrjStruct.h" //把dwg中的點位數據整理成xml文件 class CDwgDataToXml { public: CDwgDataToXml(void); ~CDwgDataToXml(void); public: //外部入口 static void Inlet(); //加載dwg圖紙 static void OnLoadDWG(); private: // 由選擇集獲得實體ID BOOL GetIdArrayFromSS(ads_name selectSet,AcDbObjectIdArray &idArray); //經過實體id得到座標點 bool GetPosFromId(const AcDbObjectId &polyId,AcGePoint3dArray &vecPoint); //獲得離標註最近的點 AcGePoint3d GetNearestPoint(const AcGePoint3d ptPoint,AcGePoint3dArray& vecXYPoint); //判斷是否加入數據結構(包1,包2等不加入) bool IsAddArr(CPointInfoArr& arrPointData,CPointInfo& ptData,AcGePoint3d ptPoint,AcDbEntity* pEnt); //經過id獲得樁位信息 bool GetDataFromId(AcDbObjectId &Id,CPointInfo& ptData,AcGePoint3dArray& vecXYPoint,CPointInfoArr& arrPointData); //經過選擇集獲得樁位信息 bool GetDataFromXZJ(resbuf* eb,CPointInfoArr& arrPointData,AcGePoint3dArray& vecXYPoint); //獲得樁位XY座標點 bool GetXYPoints(resbuf* eb,AcGePoint3dArray &vecPoint); //寫入xml文件 bool WriteXml(CPointInfoArr& arrPointData); //獲得最近的標註,並修改緩存中記錄的 bool ModifNearestLabel(CPointInfo& ptData); //獲得上一級目錄 void GetParentPath(CString & strPath); //獲得dwg圖紙路徑 CString GetDwgPath(); //打開dwg圖紙 BOOL OpenDwg(CString &strPath); // 獲取用戶選擇的路徑 bool GetUserSelectDir(CString & strPath); private: std::map<CString,AcGePoint3d> m_mapLable;//樁位名稱的位置 };
DwgDataToXml.cpp測試
#include "StdAfx.h" #import <MSXML.DLL> named_guids #include "DwgDataToXml.h" CDwgDataToXml::CDwgDataToXml(void) { } CDwgDataToXml::~CDwgDataToXml(void) { } void CDwgDataToXml::Inlet() { //圖層 struct resbuf* eb = NULL; eb = acutBuildList(-4, _T("<or"), 8, _T("最終路徑"), -4, _T("or>"),NULL); CDwgDataToXml dwgDataToxml; AcGePoint3dArray vecXYPoint;//樁位XY座標點 dwgDataToxml.GetXYPoints(eb,vecXYPoint); if (vecXYPoint.length() <= 0) return ; CPointInfoArr arrPointData; dwgDataToxml.GetDataFromXZJ(eb,arrPointData,vecXYPoint); acutRelRb(eb); //寫入xml文件 if (arrPointData.size() > 0) { dwgDataToxml.WriteXml(arrPointData); } } BOOL CDwgDataToXml::GetIdArrayFromSS( ads_name selectSet,AcDbObjectIdArray &idArray ) { idArray.setLogicalLength(0); long len = 0; acedSSLength(selectSet,&len); if (acedSSLength(selectSet,&len) != RTNORM) return FALSE; for(long i = 0; i < len; i++) { ads_name en_SS; if (acedSSName(selectSet,i,en_SS) != RTNORM) return FALSE; AcDbObjectId enId_SS; if (acdbGetObjectId(enId_SS,en_SS) != Acad::eOk) return FALSE; if (!enId_SS.isNull() && !idArray.contains(enId_SS)) { idArray.append(enId_SS); } } return TRUE; } bool CDwgDataToXml::GetPosFromId( const AcDbObjectId &polyId,AcGePoint3dArray &vecPoint) { //獲得實體 AcDbEntity* pEnt = NULL; Acad::ErrorStatus es = acdbOpenObject(pEnt,polyId,AcDb::kForRead); if (es != Acad::eOk) return false; if (pEnt->isA() == AcDbPolyline::desc())//多段線 { AcDbPolyline *pPolyline = AcDbPolyline::cast(pEnt); for (int i = 0; i < pPolyline->numVerts(); i++) { AcGePoint3d pt; pPolyline->getPointAt(i,pt); vecPoint.append(pt); } pPolyline = NULL; } else acutPrintf(_T("\n選擇實體不正確:\n")); return true; } void CDwgDataToXml::OnLoadDWG() { //獲得dwg圖紙路徑 CDwgDataToXml dwgDataToxml; CString strPath = dwgDataToxml.GetDwgPath(); //打開dwg圖紙 if(!dwgDataToxml.OpenDwg(strPath)) acdbFail(_T("打開dwg圖紙失敗")); } void CDwgDataToXml::GetParentPath( CString & strPath ) { int nPos = strPath.ReverseFind(_T('\\')); strPath = strPath.Left(nPos); //strPath.TrimRight(_T("\\")); } CString CDwgDataToXml::GetDwgPath() { TCHAR szFilePath[MAX_PATH+1]; memset(szFilePath, 0, MAX_PATH+1); GetModuleFileName(_hdllInstance, szFilePath, MAX_PATH); CString strPath(szFilePath); GetParentPath(strPath); GetParentPath(strPath); GetParentPath(strPath); strPath = strPath + _T("\\Dwg\\CAD選線成果樣例1.dwg"); if (_taccess(strPath, 0) != -1) { //用戶選擇dwg CFileDialog dlg(FALSE, _T("*.dwg"), NULL, OFN_HIDEREADONLY, _T("AutoCAD File(*.dwg)|*.dwg||"),NULL); if ( dlg.DoModal() == IDOK ) strPath = dlg.GetPathName(); } return strPath; } BOOL CDwgDataToXml::OpenDwg( CString &strPath ) { //判斷文件是否存在 TCHAR fullpath[356]; if (acedFindFile(strPath,fullpath) != RTNORM) { acdbFail(_T("工程文件沒有找到!")); return TRUE; } //打開文件 if (!acDocManager->isApplicationContext()) return FALSE; // 查看文件是否已經打開,打開則不做處理 AcApDocument *pDocOld; CString strFileName; AcApDocumentIterator *pIter = acDocManager->newAcApDocumentIterator(); Acad::ErrorStatus es = Acad::eOk; for(; !pIter->done(); pIter->step()) { pDocOld = pIter->document(); strFileName = pDocOld->fileName(); if(strFileName.CompareNoCase(strPath) == 0) { delete pIter; es = acDocManager->setCurDocument(pDocOld,AcAp::kNone,true); return TRUE; } } delete pIter; // 沒有打開 if (!acDocManager->isApplicationContext()) return FALSE; es = acDocManager->appContextOpenDocument((const TCHAR*)fullpath); if(es != Acad::eOk && es != Acad::eFilerError) //注意!!!!若是是系統加載的時候會返回eFilerError return FALSE; return TRUE; } bool CDwgDataToXml::GetXYPoints(resbuf* eb, AcGePoint3dArray &vecPoint ) { //選擇實體 acutPrintf(_T("\n請選擇實體:\n")); ads_name selectset; int rc = acedSSGet(_T(":S"),NULL,NULL,eb,selectset);// :S表示單選 if (rc == RTCAN)//用戶取消請求 { acedSSFree(selectset); return false; } else if (rc != RTNORM) { acutPrintf(_T("\n選擇實體不正確:\n")); acedSSFree(selectset); return false; } //得到實體ID AcDbObjectIdArray arrMemberId; BOOL bRet = GetIdArrayFromSS(selectset,arrMemberId); acedSSFree(selectset); if (!bRet) { acutRelRb(eb); return false; } //得到實體的座標點 if (arrMemberId.length() == 1) GetPosFromId(arrMemberId[0], vecPoint); return true; } bool CDwgDataToXml::GetDataFromXZJ(resbuf* eb,CPointInfoArr& arrPointData,AcGePoint3dArray& vecXYPoint) { ads_name SelName; int rc = acedSSGet(_T("X"), NULL, NULL,eb, SelName); if (rc != RTNORM) { acedSSFree(SelName); return false; } long len = 0; acedSSLength(SelName,&len); AcGePoint3dArray vecTextPoint;//樁位信息點 CPointInfo ptData; for (long i = 0; i < len; i++) { ads_name entName; if (acedSSName(SelName, i, entName) != RTNORM) continue; AcDbObjectId eid; acdbGetObjectId(eid, entName); if (eid == NULL) continue; GetDataFromId(eid,ptData,vecXYPoint,arrPointData); if (!ptData.m_strPointName.IsEmpty()) arrPointData.push_back(ptData); } acedSSFree(SelName); return true; } bool CDwgDataToXml::WriteXml(CPointInfoArr& arrPointData) { CString strPath; GetUserSelectDir(strPath); CTime timeCurr = CTime::GetCurrentTime(); CString strXmlName; strXmlName.Format(_T("\\樁位點數據%d%d%d%d%d%d.kml"),timeCurr.GetYear(),timeCurr.GetMonth(),timeCurr.GetDay(), timeCurr.GetHour(),timeCurr.GetMinute(),timeCurr.GetSecond()); strPath+=strXmlName; strPath.Replace(_T("\\\\"), _T("\\")); if(arrPointData.SaveXMLFile(strPath)) AfxMessageBox(_T("導出成功!")); else AfxMessageBox(_T("寫kml失敗!")); return true; } bool CDwgDataToXml::GetDataFromId( AcDbObjectId &Id,CPointInfo& ptData,AcGePoint3dArray& vecXYPoint,CPointInfoArr& arrPointData ) { //獲得實體 AcDbEntity* pEnt = NULL; Acad::ErrorStatus es = acdbOpenObject(pEnt,Id,AcDb::kForRead); if (es != Acad::eOk) return false; if (pEnt->isA() == AcDbText::desc()) { AcDbText *pText = AcDbText::cast(pEnt); ptData.m_strPointName = pText->textString(); AcGePoint3d ptPoint = pText->position(); m_mapLable[ptData.m_strPointName] = ptPoint; AcGePoint3d ptNearestPoint = GetNearestPoint(ptPoint,vecXYPoint); ptData.m_strPointX.Format(_T("%f"),ptNearestPoint.x); ptData.m_strPointY.Format(_T("%f"),ptNearestPoint.y); if (!IsAddArr(arrPointData,ptData,ptPoint,pEnt)) { //判斷是不是不須要加入的數據,不須要加入就把名字置爲空 ptData.m_strPointName.Empty(); } pText = NULL; } return true; } AcGePoint3d CDwgDataToXml::GetNearestPoint(const AcGePoint3d ptPoint,AcGePoint3dArray& vecXYPoint ) { AcGePoint3d ptNearestPoint; if (vecXYPoint.length() < 1) return ptNearestPoint; double dCurDistance = 0.0; double dMinDistance = (ptPoint - vecXYPoint[0]).length(); ptNearestPoint = vecXYPoint[0]; for (int nIndex = vecXYPoint.length() - 1; nIndex >= 0; --nIndex) { dCurDistance = (ptPoint - vecXYPoint[nIndex]).length(); if(dCurDistance < dMinDistance) { dMinDistance = dCurDistance; ptNearestPoint = vecXYPoint[nIndex]; } } return ptNearestPoint; } bool CDwgDataToXml::GetUserSelectDir( CString & strPath ) { strPath ='\0'; TCHAR szPath[MAX_PATH]; BROWSEINFO br; ITEMIDLIST * pItem; br.hwndOwner = GetDesktopWindow(); br.iImage = 0; br.pszDisplayName = 0; br.lParam = 0 ; br.lpfn = 0 ; br.lpszTitle = _T("請選擇存放xml路徑"); br.pidlRoot = 0 ; br.ulFlags = BIF_RETURNONLYFSDIRS|BIF_USENEWUI; pItem = SHBrowseForFolder(&br); if (SHGetPathFromIDList(pItem,szPath) != TRUE) { return false; } strPath = szPath; return true; } bool CDwgDataToXml::IsAddArr( CPointInfoArr& arrPointData,CPointInfo& ptData,AcGePoint3d ptCurPoint,AcDbEntity* pTextEnt) { if (ptData.m_strPointName.IsEmpty()) return false; if (arrPointData.size() < 1) return true; AcGePoint3d ptPoint; AcGePoint3d ptXYPoint(_ttol(ptData.m_strPointX),_ttol(ptData.m_strPointY),0);// for (int nIndex = arrPointData.size() - 1; nIndex >= 0; --nIndex) { if (ptData.m_strPointX == arrPointData[nIndex].m_strPointX && ptData.m_strPointY == arrPointData[nIndex].m_strPointY ) { ptPoint = m_mapLable[arrPointData[nIndex].m_strPointName];//如今標註的點 if (!ModifNearestLabel(ptData)) { double dPreDist = (ptPoint - ptXYPoint).length(); double dCurDist = (ptCurPoint - ptXYPoint).length(); if (dPreDist > dCurDist) arrPointData.erase(arrPointData.begin() + nIndex); else return false; break; } } } return true; } bool CDwgDataToXml::ModifNearestLabel(CPointInfo& ptData) { struct resbuf* eb = NULL; eb = acutBuildList(-4, _T("<or"), 8, _T("最終路徑"), -4, _T("or>"),NULL); ads_name SelName; AcGePoint3d ptPoint(_ttol(ptData.m_strPointX),_ttol(ptData.m_strPointY),0); int nRange = 10;//範圍 AcGePoint3d ptMin(ptPoint.x - nRange,ptPoint.y + nRange,0); AcGePoint3d ptMax(ptPoint.x + nRange,ptPoint.y - nRange,0); int iRet = acedSSGet(_T("W"), asDblArray(ptMin), asDblArray(ptMax), eb, SelName); acutRelRb(eb); if (iRet != RTNORM) { acedSSFree(SelName); return false; } long len = 0; acedSSLength(SelName,&len); if (len != 1) { return false; } AcDbObjectId Id; acdbGetObjectId(Id, SelName); acedSSFree(SelName); if (NULL == Id) return false; //獲得實體 AcDbEntity* pEnt = NULL; Acad::ErrorStatus es = acdbOpenObject(pEnt,Id,AcDb::kForRead); if (Acad::eOk != es) return false; if (pEnt->isA() == AcDbText::desc()) { AcDbText *pText = AcDbText::cast(pEnt); ptData.m_strPointName = pText->textString(); AcGePoint3d ptPoint = pText->position(); ptData.m_strPointX.Format(_T("%f"),ptPoint.x); ptData.m_strPointY.Format(_T("%f"),ptPoint.y); } return true; }
此處用了xml提供的一些方法,暫且封裝,以便xml與數據結構之間的交互ui
XMLExt.hthis
#pragma once #include <msxml2.h> #include <vector> #import <MSXML.DLL> named_guids ///////////////////////////////////////////////////////////////////////////////////////////// // class CHHXMLNodePtr 對MSXML::IXMLDOMNodePtr的封裝 ///////////////////////////////////////////////////////////////////////////////////////////// class __declspec(dllexport) CHHXMLNodePtr { public: CHHXMLNodePtr(void); CHHXMLNodePtr(MSXML::IXMLDOMNodePtr ptr); virtual ~CHHXMLNodePtr(void); public: CHHXMLNodePtr& operator =( MSXML::IXMLDOMNodePtr ptr); protected: MSXML::IXMLDOMElementPtr m_pNode;// 當前節點指針 public: //----------------------------------------------------------------------------------- // 函 數 名:GetNodeVar // 函數介紹:[Gettext]m_pNode節點下,名字爲lpNodeName的子節點值[用於m_pNode節點下只有一個名爲lpNodeName的子節點的狀況] // 參數介紹:LPCTSTR lpNodeName 子節點名 // OUT _HHReWrite CString* strVar 值 // 返 回 值:virtual bool //----------------------------------------------------------------------------------- bool GetNodeVar(LPCTSTR lpNodeName, CString* mVar); bool GetNodeVar(LPCTSTR lpNodeName, CString& mVar); bool GetNodeVar(LPCTSTR lpNodeName, int &mVar); bool GetNodeVar(LPCTSTR lpNodeName, long &mVar); bool GetNodeVar(LPCTSTR lpNodeName, unsigned &mVar); bool GetNodeVar(LPCTSTR lpNodeName, double &mVar); bool GetVar( CString* mVar); bool GetVar(CString& mVar); bool GetVar( int &mVar); bool GetVar( long &mVar); bool GetVar( unsigned &mVar); bool GetVar( double &mVar); // [Puttext]保存節點值,用於m_pNode節點下只有一個lpNodeName的狀況,lpNodeName不存在,則會默認建立 bool SetNodeVar (LPCTSTR lpNodeName, LPCTSTR lpVar); bool SetNodeVarV(LPCTSTR lpNodeName, LPCTSTR lpFmt,...); // 不管lpNodeName節點是否存在,都建立新的lpNodeName節點,給新節點賦值 bool SetNewNodeVar (LPCTSTR lpNodeName, LPCTSTR lpVar); bool SetNewNodeVarV(LPCTSTR lpNodeName, LPCTSTR lpFmt,...); public:// 操做當前節點屬性 // 取得屬性值 bool GetAttribute( LPCTSTR lpAttriName, CString* mVar); bool GetAttribute( LPCTSTR lpAttriName, CString& mVar); bool GetAttribute( LPCTSTR lpAttriName, int &mVar); bool GetAttribute( LPCTSTR lpAttriName, long &mVar); bool GetAttribute( LPCTSTR lpAttriName, unsigned &mVar); bool GetAttribute( LPCTSTR lpAttriName, double &mVar); bool GetAttribute( std::map<CString, CString>& mapName2Value); bool GetNodeName(CString& strName); // 寫屬性 bool SetAttribute ( LPCTSTR lpAttriName,LPCTSTR lpVar); bool SetAttributeV( LPCTSTR lpAttriName,LPCTSTR lpFmt,...); public:// 操做子項屬性 // 取得屬性值 bool GetSubAttribute(LPCTSTR lpNodeName, LPCTSTR lpAttriName, CString* mVar); bool GetSubAttribute(LPCTSTR lpNodeName, LPCTSTR lpAttriName, CString& mVar); bool GetSubAttribute(LPCTSTR lpNodeName, LPCTSTR lpAttriName, int &mVar); bool GetSubAttribute(LPCTSTR lpNodeName, LPCTSTR lpAttriName, long &mVar); bool GetSubAttribute(LPCTSTR lpNodeName, LPCTSTR lpAttriName, unsigned &mVar); bool GetSubAttribute(LPCTSTR lpNodeName, LPCTSTR lpAttriName, double &mVar); // 寫屬性 bool SetSubAttribute (LPCTSTR lpNodeName, LPCTSTR lpAttriName,LPCTSTR lpVar); bool SetSubAttributeV(LPCTSTR lpNodeName, LPCTSTR lpAttriName,LPCTSTR lpFmt,...); public: //----------------------------------------------------------------------------------- // 函 數 名:SetToSubPtr // 函數介紹:將當前m_pNode指向lpNodeName子節點[適用於子弟節點只有一個名爲lpNodeName的狀況] // 參數介紹:LPCTSTR lpNodeName 節點名稱 // bool bIsAutoCreate=true 節點不存在時,是否自動建立 // 返 回 值:bool true:成功,false:失敗 //----------------------------------------------------------------------------------- bool SetToSubPtr(LPCTSTR lpNodeName, bool bIsAutoCreate=false); //----------------------------------------------------------------------------------- // 函 數 名:SetToBrotherPtr // 函數介紹:將當前m_pNode指向lpNodeName兄弟節點[適用於兄弟節點只有一個名爲lpNodeName的狀況] // 參數介紹:LPCTSTR lpNodeName 節點名稱 // bool bIsAutoCreate=false 節點不存在時,是否自動建立 // 返 回 值:bool true:成功,false:失敗 //----------------------------------------------------------------------------------- bool SetToBrotherPtr(LPCTSTR lpNodeName, bool bIsAutoCreate=false); bool SetToBrotherPtr2(LPCTSTR lpNodeName); bool GetSubNodePtr(std::vector<IXMLDOMNodePtr>& vecSubNode); // 取得節點指針 MSXML::IXMLDOMElementPtr GetNodePtr()const{return m_pNode;} // 獲得子節點,若是失敗,則返回空【不改變當前節點】 MSXML::IXMLDOMElementPtr GetNodeSubPtr(LPCTSTR lpSubName)const; // 獲得兄弟節點,若是失敗,則返回空【不改變當前節點】 MSXML::IXMLDOMElementPtr GetNodeBrotherPtr(LPCTSTR lpNodeName)const; };
XMLExt.cpp編碼
#include "StdAfx.h" #include "XMLExt.h" #import <MSXML.DLL> named_guids CHHXMLNodePtr::CHHXMLNodePtr(void) { } CHHXMLNodePtr::CHHXMLNodePtr(MSXML::IXMLDOMNodePtr ptr) { *this = ptr; } CHHXMLNodePtr::~CHHXMLNodePtr(void) { } CHHXMLNodePtr& CHHXMLNodePtr::operator =( MSXML::IXMLDOMNodePtr ptr) { m_pNode = ptr; return *this; } //----------------------------------------------------------------------------------- // 函 數 名:GetNodeVar // 函數介紹:[Gettext]m_pNode節點下,名字爲lpNodeName的子節點值[用於m_pNode節點下只有一個名爲lpNodeName的子節點的狀況] // 參數介紹:LPCTSTR lpNodeName 子節點名 // OUT _HHReWrite CString* strVar 值 // 返 回 值:virtual bool //----------------------------------------------------------------------------------- bool CHHXMLNodePtr::GetNodeVar(LPCTSTR lpNodeName,CString* mVar) { return GetNodeVar( lpNodeName, *mVar); } bool CHHXMLNodePtr::GetNodeVar(LPCTSTR lpNodeName,CString& mVar) { try { // 取得節點 MSXML::IXMLDOMNodePtr pSingleNode = m_pNode->selectSingleNode(lpNodeName); if ( NULL == pSingleNode ) return false; mVar = (LPCTSTR)pSingleNode->Gettext(); } catch (...) { return false; } return true; } bool CHHXMLNodePtr::GetNodeVar(LPCTSTR lpNodeName, OUT int &mVar) { CString strVar; if ( !GetNodeVar(lpNodeName, &strVar) ) return false; mVar = _ttoi(strVar); return true; } bool CHHXMLNodePtr::GetNodeVar(LPCTSTR lpNodeName, OUT long &mVar) { CString strVar; if ( !GetNodeVar(lpNodeName, &strVar) ) return false; mVar = _ttol(strVar); return true; } bool CHHXMLNodePtr::GetNodeVar(LPCTSTR lpNodeName, OUT unsigned &mVar) { CString strVar; if ( !GetNodeVar(lpNodeName, &strVar) ) return false; mVar = _ttoi(strVar); return true; } bool CHHXMLNodePtr::GetNodeVar(LPCTSTR lpNodeName, OUT double &mVar) { CString strVar; if ( !GetNodeVar(lpNodeName, &strVar) ) return false; mVar = _tstof(strVar); return true; } ////////////////////////////////////////////////////////////////////////// //! @brief //! @param bool bIsForceCreateNew/*=true*/ 是否強制增長新項,若是爲false則修改已有節點的值 //! @param LPCTSTR lpNodeName 節點名 //! @param LPCTSTR lpVar 節點值 //! @exception //! @return bool //! @sa // ----------------------------------------------------------------------- // // 版本: 1.0 // ////////////////////////////////////////////////////////////////////////// bool CHHXMLNodePtr::SetNodeVar( LPCTSTR lpNodeName, LPCTSTR lpVar) { try { // 取得節點 MSXML::IXMLDOMNodePtr pSingleNode = m_pNode->selectSingleNode(lpNodeName); if ( NULL == pSingleNode ) { pSingleNode = m_pNode->GetownerDocument()->createElement(lpNodeName); if(!m_pNode->appendChild(pSingleNode)); return false; } pSingleNode->Puttext(lpVar); } catch (...) { return false; } return true; } bool CHHXMLNodePtr::SetNodeVarV( LPCTSTR lpNodeName, LPCTSTR lpFmt,...) { CString strVar; va_list mList; va_start(mList, lpFmt); strVar.FormatV(lpFmt, mList); va_end(mList); return SetNodeVar( lpNodeName, strVar); } ////////////////////////////////////////////////////////////////////////// //! @brief //! @param LPCTSTR lpNodeName //! @param LPCTSTR lpVar //! @exception //! @return bool //! @sa // ----------------------------------------------------------------------- // 版本: 1.0 // ////////////////////////////////////////////////////////////////////////// bool CHHXMLNodePtr::SetNewNodeVar( LPCTSTR lpNodeName, LPCTSTR lpVar ) { try { // 取得節點 MSXML::IXMLDOMNodePtr pSingleNode = m_pNode->GetownerDocument()->createElement(lpNodeName); if(!m_pNode->appendChild(pSingleNode)) return false; pSingleNode->Puttext(lpVar); } catch (...) { return false; } return true; } ////////////////////////////////////////////////////////////////////////// //! @brief //! @param LPCTSTR lpNodeName //! @param LPCTSTR lpFmt //! @param ... //! @exception //! @return bool //! @sa // ----------------------------------------------------------------------- // 版本: 1.0 // ////////////////////////////////////////////////////////////////////////// bool CHHXMLNodePtr::SetNewNodeVarV( LPCTSTR lpNodeName, LPCTSTR lpFmt,... ) { CString strVar; va_list mList; va_start(mList, lpFmt); strVar.FormatV(lpFmt, mList); va_end(mList); return SetNewNodeVar( lpNodeName, strVar); } //----------------------------------------------------------------------------------- // 函 數 名:SetToSubPtr // 函數介紹:將當前m_pNode指向lpNodeName子節點 // 參數介紹:LPCTSTR lpNodeName // bool bIsAutoCreate=true 節點不存在時,是否自動建立 // 返 回 值:bool true:成功,false:失敗 //----------------------------------------------------------------------------------- bool CHHXMLNodePtr::SetToSubPtr(LPCTSTR lpNodeName, bool bIsAutoCreate/*=false*/) { try { // 取得節點 MSXML::IXMLDOMNodePtr pSingleNode = m_pNode->selectSingleNode(lpNodeName); if ( NULL == pSingleNode ) { if ( !bIsAutoCreate ) return false; pSingleNode = m_pNode->GetownerDocument()->createElement(lpNodeName); m_pNode->appendChild(pSingleNode); } m_pNode = pSingleNode; } catch (...) { return false; } return true; } //----------------------------------------------------------------------------------- // 函 數 名:SetToBrotherPtr // 函數介紹:將當前m_pNode指向lpNodeName兄弟節點[適用於兄弟節點只有一個名爲lpNodeName的狀況] // 參數介紹:LPCTSTR lpNodeName 節點名稱 // bool bIsAutoCreate=false 節點不存在時,是否自動建立 // 返 回 值:bool true:成功,false:失敗 //----------------------------------------------------------------------------------- bool CHHXMLNodePtr::SetToBrotherPtr(LPCTSTR lpNodeName, bool bIsAutoCreate/*=false*/) { try { // 取得父節點 MSXML::IXMLDOMNodePtr pParentNode; if(!m_pNode->get_parentNode(&pParentNode)) return false; // 取得兄弟節點 MSXML::IXMLDOMNodePtr pSingleNode = pParentNode->selectSingleNode(lpNodeName); if ( NULL == pSingleNode ) { if ( !bIsAutoCreate ) return false; pSingleNode = pParentNode->GetownerDocument()->createElement(lpNodeName); pParentNode->appendChild(pSingleNode); } m_pNode = pSingleNode; } catch (...) { return false; } return true; } // 找子節點沒找到則找兄弟節點 bool CHHXMLNodePtr::SetToBrotherPtr2(LPCTSTR lpNodeName) { try { // 取得子節點 MSXML::IXMLDOMNodePtr pSingleNode = m_pNode->selectSingleNode(lpNodeName); if ( NULL == pSingleNode ) { // 取得兄弟節點 MSXML::IXMLDOMNodePtr pParentNode; if(!m_pNode->get_parentNode(&pParentNode)) return false; pSingleNode = pParentNode->selectSingleNode(lpNodeName); if ( NULL == pSingleNode ) return false; } m_pNode = pSingleNode; } catch (...) { return false; } return true; } ////////////////////////////////////////////////////////////////////////// //! @brief //! @param LPCTSTR lpNodeName 節點名 //! @param LPCTSTR lpAttriName 屬性名 //! @param OUT _HHReWrite CString* mVar //! @exception //! @return bool //! @sa // ----------------------------------------------------------------------- // 版本: 1.0 // ////////////////////////////////////////////////////////////////////////// bool CHHXMLNodePtr::GetSubAttribute( LPCTSTR lpNodeName, LPCTSTR lpAttriName,CString* mVar ) { if (mVar == NULL) return false; try { // 取得節點 MSXML::IXMLDOMNodePtr pSingleNode = m_pNode->selectSingleNode(lpNodeName); if ( NULL == pSingleNode ) return false; // 取得屬性 MSXML::IXMLDOMNamedNodeMapPtr pAttris = pSingleNode->Getattributes(); if ( NULL == pAttris ) return false; // 找到屬性 MSXML::IXMLDOMNodePtr pItem = pAttris->getNamedItem(lpAttriName); if ( NULL == pItem ) return false; // 取得值 *mVar = (LPCTSTR)(pItem->Gettext()); } catch (...) { return false; } return true; } bool CHHXMLNodePtr::GetSubAttribute(LPCTSTR lpNodeName, LPCTSTR lpAttriName,CString& mVar) { return GetSubAttribute(lpNodeName, lpAttriName, &mVar); } bool CHHXMLNodePtr::GetSubAttribute(LPCTSTR lpNodeName, LPCTSTR lpAttriName, OUT int &mVar) { CString strVar; if ( !GetSubAttribute(lpNodeName, lpAttriName, &strVar) ) return false; mVar = _ttoi(strVar); return true; } bool CHHXMLNodePtr::GetSubAttribute(LPCTSTR lpNodeName, LPCTSTR lpAttriName, OUT long &mVar) { CString strVar; if ( !GetSubAttribute(lpNodeName, lpAttriName, &strVar) ) return false; mVar = _ttol(strVar); return true; } bool CHHXMLNodePtr::GetSubAttribute(LPCTSTR lpNodeName, LPCTSTR lpAttriName, OUT unsigned &mVar) { CString strVar; if ( !GetSubAttribute(lpNodeName, lpAttriName, &strVar) ) return false; mVar = _ttoi(strVar); return true; } bool CHHXMLNodePtr::GetSubAttribute(LPCTSTR lpNodeName, LPCTSTR lpAttriName, OUT double &mVar) { CString strVar; if ( !GetSubAttribute(lpNodeName, lpAttriName, &strVar) ) return false; mVar = _tstof(strVar); return true; } ////////////////////////////////////////////////////////////////////////// //! @brief 寫屬性值【若是屬性不存在,則自動建立】 //! @param LPCTSTR lpNodeName 節點名 //! @param LPCTSTR lpAttriName 屬性名 //! @param LPCTSTR lpVar //! @exception //! @return bool //! @sa // ----------------------------------------------------------------------- // 版本: 1.0 ////////////////////////////////////////////////////////////////////////// bool CHHXMLNodePtr::SetSubAttribute( LPCTSTR lpNodeName, LPCTSTR lpAttriName,LPCTSTR lpVar ) { try { // 取得節點 MSXML::IXMLDOMElementPtr pSingleNode = m_pNode->selectSingleNode(lpNodeName); if ( NULL == pSingleNode ) { pSingleNode = m_pNode->GetownerDocument()->createElement(lpNodeName); if(!m_pNode->appendChild(pSingleNode)) return false; } pSingleNode->setAttribute(lpAttriName, lpVar); } catch (...) { return false; } return true; } bool CHHXMLNodePtr::SetSubAttributeV(LPCTSTR lpNodeName, LPCTSTR lpAttriName, LPCTSTR lpFmt,...) { CString strVar; va_list mList; va_start(mList, lpFmt); strVar.FormatV(lpFmt, mList); va_end(mList); return SetSubAttribute(lpNodeName, lpAttriName, strVar); } ////////////////////////////////////////////////////////////////////////// //! @brief //! @param LPCTSTR lpAttriName //! @param OUT _HHReWrite CString* mVar //! @exception //! @return bool //! @sa // ----------------------------------------------------------------------- // 版本: 1.0 ////////////////////////////////////////////////////////////////////////// bool CHHXMLNodePtr::GetAttribute( LPCTSTR lpAttriName, CString* mVar ) { if(m_pNode==NULL || mVar==NULL) return false; try { // 取得屬性 MSXML::IXMLDOMNamedNodeMapPtr pAttris = m_pNode->Getattributes(); if ( NULL == pAttris ) return false; // 找到屬性 MSXML::IXMLDOMNodePtr pItem = pAttris->getNamedItem(lpAttriName); if ( NULL == pItem ) return false; // 取得值 *mVar = (LPCTSTR)(pItem->Gettext()); } catch (...) { return false; } return true; } bool CHHXMLNodePtr::GetAttribute( LPCTSTR lpAttriName,CString& mVar) { return GetAttribute( lpAttriName, &mVar); } bool CHHXMLNodePtr::GetAttribute(LPCTSTR lpAttriName, int &mVar) { CString strVar; if ( !GetAttribute( lpAttriName, &strVar) ) return false; mVar = _ttoi(strVar); return true; } bool CHHXMLNodePtr::GetAttribute(LPCTSTR lpAttriName, OUT long &mVar) { CString strVar; if ( !GetAttribute( lpAttriName, &strVar) ) return false; mVar = _ttol(strVar); return true; } bool CHHXMLNodePtr::GetAttribute( LPCTSTR lpAttriName, OUT unsigned &mVar) { CString strVar; if ( !GetAttribute( lpAttriName, &strVar) ) return false; mVar = _ttoi(strVar); return true; } bool CHHXMLNodePtr::GetAttribute( LPCTSTR lpAttriName, OUT double &mVar) { CString strVar; if ( !GetAttribute( lpAttriName, &strVar) ) return false; mVar = _tstof(strVar); return true; } bool CHHXMLNodePtr::GetAttribute( std::map<CString, CString>& mapName2Value ) { if(m_pNode==NULL) return false; try { // 取得屬性 MSXML::IXMLDOMNamedNodeMapPtr pAttris = m_pNode->Getattributes(); if ( NULL == pAttris ) return false; for (int i=0; i<pAttris->length; ++i) { MSXML::IXMLDOMNodePtr pItem = pAttris->Getitem(i); if ( NULL == pItem ) continue; CString strName((TCHAR*)pItem->nodeName); mapName2Value[strName] = CString((TCHAR*)pItem->text); } } catch (...) { return false; } return true; } ////////////////////////////////////////////////////////////////////////// //! @brief 寫屬性值【若是屬性不存在,則自動建立】 //! @param LPCTSTR lpNodeName 節點名 //! @param LPCTSTR lpAttriName 屬性名 //! @param LPCTSTR lpVar //! @exception //! @return bool //! @sa // ----------------------------------------------------------------------- // 版本: 1.0 ////////////////////////////////////////////////////////////////////////// bool CHHXMLNodePtr::SetAttribute( LPCTSTR lpAttriName,LPCTSTR lpVar ) { try { m_pNode->setAttribute(lpAttriName, lpVar); } catch (...) { return false; } return true; } bool CHHXMLNodePtr::SetAttributeV(LPCTSTR lpAttriName, LPCTSTR lpFmt,...) { CString strVar; va_list mList; va_start(mList, lpFmt); strVar.FormatV(lpFmt, mList); va_end(mList); return SetAttribute(lpAttriName, strVar); } ////////////////////////////////////////////////////////////////////////// //! @brief //! @param LPCTSTR lpSubName //! @exception //! @return MSXML::IXMLDOMElementPtr //! @sa // ----------------------------------------------------------------------- // 版本: 1.0 ////////////////////////////////////////////////////////////////////////// MSXML::IXMLDOMElementPtr CHHXMLNodePtr::GetNodeSubPtr( LPCTSTR lpSubName ) const { try { // 取得節點 return m_pNode->selectSingleNode(lpSubName); } catch (...) { } return NULL; } ////////////////////////////////////////////////////////////////////////// //! @brief //! @param LPCTSTR lpNodeName //! @exception //! @return MSXML::IXMLDOMElementPtr //! @sa // ----------------------------------------------------------------------- // // 版本: 1.0 ////////////////////////////////////////////////////////////////////////// MSXML::IXMLDOMElementPtr CHHXMLNodePtr::GetNodeBrotherPtr( LPCTSTR lpNodeName ) const { try { // 取得父節點 MSXML::IXMLDOMNodePtr pParentNode; if(!m_pNode->get_parentNode(&pParentNode)) return NULL; // 取得兄弟節點 MSXML::IXMLDOMNodePtr pSingleNode = pParentNode->selectSingleNode(lpNodeName); return pSingleNode; } catch (...) { } return NULL; } bool CHHXMLNodePtr::GetVar( CString* mVar ) { return GetVar( *mVar); } bool CHHXMLNodePtr::GetVar(CString& mVar ) { try { // 取得節點 if ( NULL == m_pNode ) return false; mVar = (LPCTSTR)m_pNode->Gettext(); } catch (...) { return false; } return true; } bool CHHXMLNodePtr::GetVar(int &mVar ) { CString strVar; if ( !GetVar( &strVar) ) return false; mVar = _ttoi(strVar); return true; } bool CHHXMLNodePtr::GetVar(long &mVar ) { CString strVar; if ( !GetVar( &strVar) ) return false; mVar = _ttol(strVar); return true; } bool CHHXMLNodePtr::GetVar( OUT unsigned &mVar ) { CString strVar; if ( !GetVar( &strVar) ) return false; mVar = _ttoi(strVar); return true; } bool CHHXMLNodePtr::GetVar( OUT double &mVar ) { CString strVar; if ( !GetVar( &strVar) ) return false; mVar = _tstof(strVar); return true; } bool CHHXMLNodePtr::GetSubNodePtr( std::vector<IXMLDOMNodePtr>& vecSubNode ) { try { // 取得子節點 MSXML::IXMLDOMNodeList *pChildList(NULL); if (S_OK != m_pNode->get_childNodes(&pChildList) || NULL == pChildList) return false; for (int i=0; i<pChildList->Getlength(); ++i) { IXMLDOMNodePtr pItem = pChildList->Getitem(i); if (NULL == pItem) continue; vecSubNode.push_back(pItem); } } catch (...) { return false; } return true; } bool CHHXMLNodePtr::GetNodeName( CString& strName ) { BSTR bstr = NULL; if (S_OK != m_pNode->get_nodeName(&bstr) || NULL == bstr) return false; strName = (TCHAR*)bstr; return true; }
PrjStruct.h
#pragma once #include <vector> #include <msxml2.h> #import <MSXML.DLL> named_guids class CIniFileN; ///////////////////////////////////////////////////////////////////////////////////////////// // class CXMLElement 保存、合成XML格式的基類 ///////////////////////////////////////////////////////////////////////////////////////////// interface __declspec(dllexport) CXMLElement { public: CXMLElement():m_strverencoding(_T("version=\'1.0\'")){} virtual ~CXMLElement(){} public: // 讀取XML格式的字符串,給成員賦值 virtual bool LoadXML(IN LPCTSTR lpXMLStr)=0; virtual bool LoadXML(MSXML::IXMLDOMNodePtr pNode)=0; // 將成員值,保存爲XML格式 virtual bool SaveXML( CString* strXML)const=0; virtual bool SaveXML( MSXML::IXMLDOMNodePtr pNode)const=0; // 函數自測試 virtual bool SelfTest(){return false;}; // 取得根節點名 LPCTSTR GetRootNodeIn()const{return GetRootNode();} public: // 保存到XML文件 virtual bool SaveXMLFile(LPCTSTR lpFileName)const; // 讀取XML文件 virtual bool LoadXMLFile(LPCTSTR lpFileName); // [須要GetRootNode()節點] virtual bool LoadNodeXML(MSXML::IXMLDOMNodePtr pNode)=0; // 將成員值,保存爲XML格式 virtual bool SaveNodeXML( MSXML::IXMLDOMNodePtr pNode)const=0; // 取得根節點名 virtual LPCTSTR GetRootNode()const=0; // 設置xml文件頭部的version='1.0' encoding='GB2312',默認爲 version='1.0',不指定編碼方式 void SetVersionEncoding(LPCTSTR lpverencod); private: CString m_strverencoding; }; ///////////////////////////////////////////////////////////////////////////////////////////// // struct CHHElement: public CXMLElement 對基類的次級封裝,目的統一完成某幾個函數 ///////////////////////////////////////////////////////////////////////////////////////////// struct __declspec(dllexport) CHHElement: public CXMLElement { public: CHHElement(); ~CHHElement(); public: // 讀取XML格式的字符串,給成員賦值 virtual bool LoadXML(IN LPCTSTR lpXMLStr); virtual bool LoadXML(MSXML::IXMLDOMNodePtr pNode){return LoadNodeXML(pNode);} // 將成員值,保存爲XML格式 virtual bool SaveXML(CString* strXML)const; virtual bool SaveXML(MSXML::IXMLDOMNodePtr pNode)const{return SaveNodeXML(pNode);} }; ///////////////////////////////////////////////////////////////////////////////////////////// // struct CArrBase 數組封裝 ///////////////////////////////////////////////////////////////////////////////////////////// template<class T> struct __declspec(dllexport) CArrBase: public std::vector<T> { public: // 查找序號 template<class _Pr> int Find(_Pr op )const { std::vector<T>::const_iterator mIter = std::find_if(begin(), end(), op); if ( mIter == end() ) return -1; return mIter-begin(); } template<class _Pr> std::vector<int> FindAll(_Pr op )const { std::vector<int> arrRet; for (int i=0; i<(int)size(); ++i) { if ( op(at(i))) { arrRet.push_back(i); } } return arrRet; } // 排序 template<class _Pr> __inline void Sort(_Pr op) { std::sort(begin(), end(), op); } __inline void Sort(){std::sort(begin(), end());} // 清除指定序號記錄 __inline virtual void RemoveAt(int nIndex) { if ( nIndex>=0 && nIndex<(int)size() ) { erase(begin()+nIndex); } } }; ///////////////////////////////////////////////////////////////////////////////////////////// // struct CArrElementTest: protected CArrBase<CXMLElement*> 元素自測試數組 ///////////////////////////////////////////////////////////////////////////////////////////// struct __declspec(dllexport) CArrElementTest: protected CArrBase<CXMLElement*> { public: CArrElementTest(); virtual ~CArrElementTest(); public: // 添加一個測試實體 template<class T> void Add() { T* pItem = new T; push_back(pItem); } // 清除所有 virtual void clear(); // 進行自測試 virtual void TestAll(); }; ///////////////////////////////////////////////////////////////////////////////////////////// // struct CArrElementBase: public CHHElement, public CArrBase<T> 元素數組操做封裝 ///////////////////////////////////////////////////////////////////////////////////////////// template<class T> struct __declspec(dllexport) CArrElementBase: public CHHElement, public CArrBase<T> { typedef const CArrBase<T>* _CArrBasePtr; public: // 重載等號/不等號 bool operator == (const CArrElementBase&p1 )const { return *((_CArrBasePtr)this)==*((_CArrBasePtr)(&p1));} bool operator != (const CArrElementBase&p1 )const { return !(*this==p1); } protected: // 讀取XML格式的字符串,給成員賦值 virtual bool LoadNodeXML(MSXML::IXMLDOMNodePtr pNode) { try { // 解析取每一個元素 T tmp; MSXML::IXMLDOMNodeListPtr pNodeList = pNode->selectNodes(tmp.GetRootNodeIn()); const int nCount = pNodeList->Getlength(); if ( nCount < 1 ) return true; // 循環建立每一個元素信息 for (int i=0; i<nCount; ++i) { // 取得節點信息 T mInfo; if(!mInfo.LoadXML(pNodeList->Getitem(i))) continue; push_back(mInfo); } } catch(...) { return false; } return true; } // 將成員值,保存爲XML格式 virtual bool SaveNodeXML( MSXML::IXMLDOMNodePtr pNode)const { const int nCount = size(); for (int i=0; i<nCount; ++i) { // 一條信息 const T& mItem = at(i); try { // 建立一個節點 MSXML::IXMLDOMNodePtr pNew = pNode->GetownerDocument()->createElement(mItem.GetRootNodeIn()); if(!pNode->appendChild(pNew)) continue; // 保存節點信息 if(!mItem.SaveXML(pNew)) return false; } catch(...) { continue; } } return true; } }; //樁位信息 class __declspec(dllexport) CPointInfo : public CHHElement { public: CPointInfo(){} ~CPointInfo(){} public: CString m_strPointX; CString m_strPointY; CString m_strPointName; protected: static LPCTSTR node_PointInfo;//節點 static LPCTSTR glb_strPointX; static LPCTSTR glb_strPointY; static LPCTSTR glb_strPointName; protected: virtual LPCTSTR GetRootNode()const{return GetSelfRoot();}; virtual bool LoadNodeXML(MSXML::IXMLDOMNodePtr pNode); virtual bool SaveNodeXML( MSXML::IXMLDOMNodePtr pNode)const; public: static LPCTSTR GetSelfRoot(); }; class __declspec(dllexport) CPointInfoArr : public CArrElementBase<CPointInfo> { public: CPointInfoArr(); virtual~CPointInfoArr(); protected: static LPCTSTR node_PointInfoArr;//節點 protected: virtual LPCTSTR GetRootNode()const{return GetSelfRoot();}; public: //讀取XML格式的字符串 virtual bool LoadNodeXML(MSXML::IXMLDOMNodePtr pNode); //保存成xml格式 virtual bool SaveNodeXML(MSXML::IXMLDOMNodePtr pNode)const; public: static LPCTSTR GetSelfRoot(); };
PrjStruct.cpp
#include "StdAfx.h" #include "PrjStruct.h" #include "XMLExt.h" #import <MSXML.DLL> named_guids ////////////////////////////////////////////////////////////////////////// //! @brief //! @param LPCTSTR lpFileName //! @exception //! @return bool //! @sa // ----------------------------------------------------------------------- // 版本: 1.0 ////////////////////////////////////////////////////////////////////////// bool CXMLElement::SaveXMLFile( LPCTSTR lpFileName ) const { try { // 建立根節點 MSXML::IXMLDOMDocumentPtr pXmlDoc; if(pXmlDoc.CreateInstance(MSXML::CLSID_DOMDocument) != S_OK) return false; MSXML::IXMLDOMProcessingInstructionPtr pi = pXmlDoc->createProcessingInstruction(_T("xml"), (LPCTSTR)m_strverencoding); _variant_t vNullVal; vNullVal.vt = VT_NULL; pXmlDoc->insertBefore(pi, vNullVal); MSXML::IXMLDOMNodePtr pRoot = pXmlDoc->createElement(GetRootNode()); if(!pXmlDoc->appendChild(pRoot)) return false; // 向節點中寫信息 if(!SaveNodeXML(pRoot)) return false; // 取得XML信息 pXmlDoc->save(lpFileName); } catch(...) { return false; } return true; } ////////////////////////////////////////////////////////////////////////// //! @brief 讀取XML文件 //! @param LPCTSTR lpFileName XML文件名稱 //! @exception //! @return bool //! @sa // ----------------------------------------------------------------------- // 版本: 1.0 ////////////////////////////////////////////////////////////////////////// bool CXMLElement::LoadXMLFile( LPCTSTR lpFileName ) { try { // 建立根節點 MSXML::IXMLDOMDocumentPtr pXmlDoc; if(pXmlDoc.CreateInstance(MSXML::CLSID_DOMDocument) != S_OK) return false; // 取得XML信息 if(!pXmlDoc->load(lpFileName)) return false; return LoadNodeXML(pXmlDoc->GetdocumentElement()); } catch(...) { return false; } return true; } void CXMLElement::SetVersionEncoding(LPCTSTR lpverencod) { if (lpverencod != NULL && lpverencod[0] != _T('\0')) m_strverencoding = lpverencod; } ///////////////////////////////////////////////////////////////////////////////////////////// // struct CHHElement: public CXMLElement 對基類的次級封裝,目的統一完成某幾個函數 ///////////////////////////////////////////////////////////////////////////////////////////// CHHElement::CHHElement() { } CHHElement::~CHHElement() { } // 讀取XML格式的字符串,給成員賦值 bool CHHElement::LoadXML(IN LPCTSTR lpXMLStr) { try { // 載入字符串 MSXML::IXMLDOMDocumentPtr pXmlDoc; if(pXmlDoc.CreateInstance(MSXML::CLSID_DOMDocument) != S_OK) return false; if(!pXmlDoc->loadXML(lpXMLStr)); return false; if(!LoadNodeXML(pXmlDoc->GetdocumentElement())) return false; } catch(...) { return false; } return true; } // 將成員值,保存爲XML格式 bool CHHElement::SaveXML(CString* strXML)const { try { // 建立根節點 MSXML::IXMLDOMDocumentPtr pXmlDoc; if(pXmlDoc.CreateInstance(MSXML::CLSID_DOMDocument) != S_OK ) return false; MSXML::IXMLDOMNodePtr pRoot = pXmlDoc->createElement(GetRootNode()); if(!pXmlDoc->appendChild(pRoot)) return false; // 向節點中寫信息 if(!SaveNodeXML(pRoot)) return false; // 取得XML信息 *strXML = (LPCTSTR)pXmlDoc->Getxml(); } catch(...) { return false; } return true; } ///////////////////////////////////////////////////////////////////////////////////////////// // struct CArrElementTest: protected CArrBase<CXMLElement*> 元素自測試數組 ///////////////////////////////////////////////////////////////////////////////////////////// CArrElementTest::CArrElementTest() { } CArrElementTest::~CArrElementTest() { clear(); } void CArrElementTest::clear() { const int nCount = size(); for (int i=0; i<nCount; ++i) { delete at(i); } clear(); } // 進行自測試 void CArrElementTest::TestAll() { const int nCount = size(); for (int i=0; i<nCount; ++i) { if(!at(i)->SelfTest()) return; } } //////////////////////////////樁位信息///////////////////////// LPCTSTR CPointInfoArr::node_PointInfoArr = _T("Points"); CPointInfoArr::CPointInfoArr() { } CPointInfoArr::~CPointInfoArr() { } LPCTSTR CPointInfoArr::GetSelfRoot() { return node_PointInfoArr; } bool CPointInfoArr::LoadNodeXML( MSXML::IXMLDOMNodePtr pNode ) { try { CHHXMLNodePtr pNodePtr(pNode); if(__super::LoadNodeXML(pNode)) return false; } catch(...) { return false; } return true; } bool CPointInfoArr::SaveNodeXML(MSXML::IXMLDOMNodePtr pNode ) const { try { if(!__super::SaveNodeXML(pNode)) return false; } catch(...) { return false; } return true; } LPCTSTR CPointInfo::node_PointInfo = _T("Point" ); LPCTSTR CPointInfo::glb_strPointX = _T("X" ); LPCTSTR CPointInfo::glb_strPointY = _T("Y" ); LPCTSTR CPointInfo::glb_strPointName = _T("Name" ); LPCTSTR CPointInfo::GetSelfRoot() { return node_PointInfo; } bool CPointInfo::LoadNodeXML( MSXML::IXMLDOMNodePtr pNode ) { try { CHHXMLNodePtr pNodePtr(pNode); pNodePtr.GetNodeVar(glb_strPointX, m_strPointX); pNodePtr.GetNodeVar(glb_strPointY, m_strPointY); pNodePtr.GetNodeVar(glb_strPointName, m_strPointName); } catch(...) { return false; } return true; } bool CPointInfo::SaveNodeXML(MSXML::IXMLDOMNodePtr pNode ) const { try { CHHXMLNodePtr pNodePtr(pNode); pNodePtr.SetAttribute(glb_strPointX, m_strPointX); pNodePtr.SetAttribute(glb_strPointY, m_strPointY); pNodePtr.SetAttribute(glb_strPointName, m_strPointName); } catch(...) { return false; } return true; }