VC++利用微软msxml3.dll创造xml文件
VC++利用微软msxml3.dll创建xml文件
其次编写创建xml文件方法
VC6.0下创建xml文件有很多方式,尝试了timyxml,但是他不支持文件声明等的写入,因此转战MSXML
MSXML有很多版本,这里用的是msxml3
首先在头文件中引入
#import "msxml3.dll" using namespace MSXML2;
其次编写创建xml文件方法
void CCVideoDlg::CreateXML() { MSXML2::IXMLDOMDocument2Ptr pXMLDom; MSXML2::IXMLDOMProcessingInstructionPtr pi; HRESULT hr; CoInitialize(NULL); hr = pXMLDom.CreateInstance(__uuidof(DOMDocument)); if (FAILED(hr)) { printf("Failed to CreateInstance on an XML DOM"); } pXMLDom->preserveWhiteSpace = VARIANT_TRUE; //添加声明 pi = pXMLDom->createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'"); if (pi != NULL) { pXMLDom->appendChild(pi); pi.Release(); } //创建样式表 pi = pXMLDom->createProcessingInstruction("xml-stylesheet","type='text/xsl' href='./../utils/detail.xsl'"); if (pi != NULL) { pXMLDom->appendChild(pi); pi.Release(); } // 创建注释 MSXML2::IXMLDOMCommentPtr pc; pc = pXMLDom->createComment("xmlReport.xml created using XML DOM object."); if (pc != NULL) { pXMLDom->appendChild(pc); pc.Release(); } char CurrentDateTime[32]; getCurrentTime(CurrentDateTime); // 创建root节点 MSXML2::IXMLDOMElementPtr pb,pd; pb= pXMLDom->createElement("body"); pXMLDom->appendChild(pb); pd = pXMLDom->createElement("Details"); MSXML2::IXMLDOMAttributePtr pa; pa = pXMLDom->createAttribute("time"); if (pa != NULL) { pa->value = CurrentDateTime; pd->setAttributeNode(pa); } pa = pXMLDom->createAttribute("threshold"); if (pa != NULL) { CString threadThold; threadThold.Format("%d",m_sliderCtrl.GetPos()); pa->value = (_bstr_t)threadThold; pd->setAttributeNode(pa); } pa = pXMLDom->createAttribute("diffPercent"); if (pa != NULL) { CString diff; GetDlgItemText(IDC_diffRateEDIT1,diff); pa->value =(_bstr_t)diff; pd->setAttributeNode(pa); } pb->appendChild(pd); pb->appendChild(pXMLDom->createTextNode("\n\t")); //释放节点 pd.Release(); pb.Release(); hr = pXMLDom->save((_variant_t)saveXMLReportName); if (FAILED(hr)) { printf("Failed to save DOM to xmlReport.xml\n"); } else { printf("DOM saved to xmlReport.xml\n"); } if (pXMLDom) pXMLDom.Release(); CoUninitialize(); }
void CCVideoDlg::AddXMLNode(CString filePath,CString snapTimes,char currentTime[32],CString cameraId,int countNum,CString state) { MSXML2::IXMLDOMDocument2Ptr pDoc; HRESULT hr = pDoc.CreateInstance( __uuidof(MSXML2::DOMDocument30), NULL, CLSCTX_INPROC_SERVER); if (FAILED(hr)) { printf("Failed to CreateInstance on an XML DOM"); } pDoc->async = VARIANT_FALSE; pDoc->validateOnParse = VARIANT_FALSE; pDoc->resolveExternals = VARIANT_FALSE; if( pDoc->load((_variant_t)filePath) != VARIANT_TRUE) { printf("Fail reason: %s\n", (LPCSTR)pDoc->parseError->Getreason()); } else { MSXML2::IXMLDOMNodePtr pNode = pDoc->selectSingleNode(L"body/RESULTS"); //首先要找到RESULTS节点,因为是要在它之后插入 pNode->appendChild(pDoc->createTextNode("\n\t")); MSXML2::IXMLDOMElementPtr pResultNode=pDoc->createNode(CComVariant(NODE_ELEMENT),"RESULT",""); pResultNode->appendChild(pDoc->createTextNode("\n\t")); pNode->appendChild(pResultNode); pNode.Release(); pResultNode->setAttribute("snapTimes",(_bstr_t)snapTimes); pResultNode->setAttribute("currentTime",currentTime); pResultNode->setAttribute("TV_Name",(_bstr_t)cameraId); CString strNums; strNums.Format("%d",countNum); pResultNode->setAttribute("diffPercent",(_bstr_t)strNums); pResultNode->setAttribute("state",(_bstr_t)state); //图片路径节点 CString imgSrc; imgSrc.Format("%s_%s.jpeg",currentTime,snapTimes); pResultNode->setAttribute("imgSrc",(_bstr_t)imgSrc); pDoc->save((_variant_t)filePath); pResultNode.Release(); } if (pDoc) pDoc.Release(); }