windows读写xml,可以使用自带的com组件msxml6.dll。
一,引用组件
#inport <msxml6.dll>
注意:
1,安装的不同版本VS,xml的版本不一样,2019是msxml6.dll, 其他版本可以到system32目录下看是哪个版本。另外,64位的库在sysWow64目录下。
2,组件引用后会自动生成 msxml6.tlh,这里会有所有的组件方法。如果编译不过,可以到这个文件里找对应的,比如实例名称msxml6中是MSXML2::DOMDocument60,msxml4中是MSXML2::DOMDocument40,在tlh文件一般情况下都能快速找到对应的项。
二、读xml文件
void CxmlTestDlg::OnBnClickedButtonRead()
{
MSXML2::IXMLDOMDocumentPtr pDoc;
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60));
if (!SUCCEEDED(hr))
{
MessageBox(_T("创建DOMDocument对象失败。\n请检查运行环境"), _T("错误"), MB_ICONERROR);
return;
}
// 读取xml
pDoc->put_async(VARIANT_FALSE);
VARIANT_BOOL bhr = pDoc->load((_variant_t)m_strPath);
if (bhr != VARIANT_TRUE) {
MessageBox(_T("无法正确读取xml文件"), _T("错误"), MB_ICONERROR);
return;
}
// 根节点取得
MSXML2::IXMLDOMElementPtr root = pDoc->documentElement;
// 取得根节点的名字
_variant_t strRootName = root->nodeName;
_bstr_t wstrRootName(strRootName.bstrVal);
MSXML2::IXMLDOMNodeListPtr nodeList = root->GetchildNodes();
// 获取同级节点数量
long lNodeNum = 0;
nodeList->get_length(&lNodeNum);
for (int i = 0; i < lNodeNum; i++)
{
MSXML2::IXMLDOMNodePtr pNode = NULL;
nodeList->get_item(i, &pNode);
if (pNode)
{
// 获取节点的所有内容
_bstr_t bstrDocCotents = pNode->Getxml();
CString cstrContents = (LPCTSTR)bstrDocCotents;
// 获取节点中所有CData数据
CString cstrText = pNode->Gettext();
m_strSrc = cstrText;
m_strDest = cstrContents;
// 获取子节点
MSXML2::IXMLDOMNodeListPtr pTmpNode = pNode->GetnextSibling();
// 获取节点的名称
CString cstrNodeName = pNode->nodeName;
// 获取节点的值(此处拿到的值是CData值)
CString cstrNodeText = pNode->text;
// 获取节点的所有属性
MSXML2::IXMLDOMNamedNodeMapPtr attributesPtr;
pNode->get_attributes(&attributesPtr);
// 获取属性的个数
long lAttributesNum = 0;
attributesPtr->get_length(&lAttributesNum);
for (int j = 0; j < lAttributesNum; j++)
{
// 获取单个属性
MSXML2::IXMLDOMNodePtr attributeInfo = attributesPtr->Getitem(j);
// 获取属性名称
CString cstrName = attributeInfo->nodeName;
// 获取属性值
CString cstrText = attributeInfo->text;
}
break;
}
}
UpdateData(FALSE);
}
注意:因为是引用com组件,需要初始化环境,记得在合适的地方加入::CoInitialize(NULL); ::CoUnInitialize(NULL);
三、写xml
// 将原来的xml,重新写入新的文件,新的文件在原有文件名前加上upload
void CxmlTestDlg::OnBnClickedButtonSave()
{
MSXML2::IXMLDOMDocumentPtr writeXmlDoc; // 用来写xml的doc
HRESULT HR = writeXmlDoc.CreateInstance(_uuidof(MSXML2::DOMDocument60));
if (!SUCCEEDED(HR))
{
return;
}
MSXML2::IXMLDOMDocumentPtr pDoc; // 用来读取xml的doc
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60));
if (!SUCCEEDED(hr))
{
MessageBox(_T("创建DOMDocument对象失败。\n请检查运行环境"), _T("错误"), MB_ICONERROR);
return;
}
// 读取xml
VARIANT_BOOL bhr = pDoc->load((_variant_t)m_strFileWithPath);
if (bhr != VARIANT_TRUE) {
MessageBox(_T("无法正确读取xml文件"), _T("错误"), MB_ICONERROR);
return;
}
// 根节点取得
MSXML2::IXMLDOMElementPtr root = pDoc->documentElement;
// 创建节点
MSXML2::IXMLDOMProcessingInstructionPtr pDomPI;
pDomPI = writeXmlDoc->createProcessingInstruction(_bstr_t("xml"), _bstr_t(_T("version=\"1.0\" encoding=\"utf-8\" ")));
writeXmlDoc->appendChild(pDomPI);
_variant_t strRootName = root->nodeName;
MSXML2::IXMLDOMElementPtr rootElem = writeXmlDoc->createElement(root->nodeName);
WriteNodeInfo(rootElem, root, writeXmlDoc);
writeXmlDoc->appendChild(rootElem);
MSXML2::IXMLDOMTextPtr rootText = pDoc->createTextNode(L"\n");
rootElem->appendChild(rootText);
// 获取子节点
MSXML2::IXMLDOMNodeListPtr nodeList = root->GetchildNodes();
// 获取同级节点数量
long lNodeNum = 0;
nodeList->get_length(&lNodeNum);
for (int i = 0; i < lNodeNum; i++)
{
MSXML2::IXMLDOMNodePtr pNode = NULL;
nodeList->get_item(i, &pNode);
if (pNode)
{
// 创建节点
_variant_t strNode1Name = pNode->nodeName;
MSXML2::IXMLDOMElementPtr node1Elem = writeXmlDoc->createElement(pNode->nodeName);
WriteNodeInfo(node1Elem, pNode, writeXmlDoc);
MSXML2::IXMLDOMNodeListPtr node2List = pNode->GetchildNodes();
long lNodeNum2 = 0;
node2List->get_length(&lNodeNum2);
for (int j = 0; j < lNodeNum2; j++)
{
MSXML2::IXMLDOMNodePtr pNode2 = NULL;
node2List->get_item(j, &pNode2);
if (pNode2)
{
_variant_t strNode2Name = pNode2->nodeName;
MSXML2::IXMLDOMElementPtr node2Elem = writeXmlDoc->createElement(pNode2->nodeName);
WriteNodeInfo(node2Elem, pNode2, writeXmlDoc);
MSXML2::IXMLDOMNodeListPtr node3List = pNode2->GetchildNodes();
long lNodeNum3 = 0;
node3List->get_length(&lNodeNum3);
for (int k = 0; k < lNodeNum3; k++)
{
MSXML2::IXMLDOMNodePtr pNode3 = NULL;
node3List->get_item(k, &pNode3);
if (pNode3)
{
_variant_t strNode3Name = pNode3->nodeName;
MSXML2::IXMLDOMElementPtr node3Elem = writeXmlDoc->createElement(pNode3->nodeName);
WriteNodeInfo(node3Elem, pNode3, writeXmlDoc);
MSXML2::IXMLDOMNodeListPtr node4List = pNode3->GetchildNodes();
int nRowRecord = 0;
long lNodeNum4 = 0;
node4List->get_length(&lNodeNum4);
for (int m = 0; m < lNodeNum4; m++)
{
MSXML2::IXMLDOMNodePtr pNode4 = NULL;
node4List->get_item(m, &pNode4);
if (pNode4)
{
CString strNode3Name = pNode4->nodeName;
MSXML2::IXMLDOMElementPtr node4Elem = writeXmlDoc->createElement(pNode4->nodeName);
if (strNode3Name.CompareNoCase(L"Row") == 0 )
{
if (nRowRecord++ == 0)
{
AddCheckNode(writeXmlDoc, node3Elem);
}
// 写入test
CString cstrText = pNode4->Gettext();
CString cstrNodeText;
cstrNodeText.Format(_T("11122223334455555")/*, cstrText*/);
MSXML2::IXMLDOMCDATASectionPtr DOMNodePtr = writeXmlDoc->createCDATASection(cstrNodeText.GetBuffer());
node4Elem->appendChild(DOMNodePtr);
MSXML2::IXMLDOMTextPtr node4Text = pDoc->createTextNode(L"\n\t\t\t\t");
node3Elem->appendChild(node4Text);
node3Elem->appendChild(node4Elem);
continue;
}
WriteNodeInfo(node4Elem, pNode4, writeXmlDoc);
MSXML2::IXMLDOMTextPtr node4Text = pDoc->createTextNode(L"\n\t\t\t\t");
node3Elem->appendChild(node4Text);
node3Elem->appendChild(node4Elem);
}
}
MSXML2::IXMLDOMTextPtr node3Text = pDoc->createTextNode(L"\n\t\t\t");
node2Elem->appendChild(node3Text);
node2Elem->appendChild(node3Elem);
MSXML2::IXMLDOMTextPtr node3TailText = pDoc->createTextNode(L"\n\t");
node2Elem->appendChild(node3TailText);
}
}
MSXML2::IXMLDOMTextPtr node2Text = pDoc->createTextNode(L"\n\t\t");
node1Elem->appendChild(node2Text);
node1Elem->appendChild(node2Elem);
MSXML2::IXMLDOMTextPtr node2TailText = pDoc->createTextNode(L"\n\t");
node1Elem->appendChild(node2TailText);
}
}
MSXML2::IXMLDOMTextPtr node1Text = pDoc->createTextNode(L"\n\t");
rootElem->appendChild(node1Text);
rootElem->appendChild(node1Elem);
MSXML2::IXMLDOMTextPtr node1TailText = pDoc->createTextNode(L"\n");
rootElem->appendChild(node1TailText);
}
}
m_strDest = (char *)writeXmlDoc->Gettext();
CString file = m_strPath + L"\\upload_" + m_strFileName;
writeXmlDoc->save(file.GetBuffer());
rootElem.Release();
writeXmlDoc.Release();
UpdateData(FALSE);
}
需要demo的同学,可以留言或联系邮箱:yujingjiang86@163.com