XML是通用的数据存储格式,默认使用UTF-8字符集。
对于绿色版(不写注册表)的程序,XML也可以用来储存配置信息。
对于绿色版(不写注册表)的程序,XML也可以用来储存配置信息。
<code class="lang-cpp">// 此处也可以是msxml2或msxml4等,哪个可以编译通过就用哪个 // 无论2、3、4,命名空间都是MSXML2 #import <msxml3.dll></msxml3.dll></code>然后在CxxxxxApp的InitInstance()中加入OLE支持:
<code class="lang-cpp">BOOL CSettingsRWTestApp::InitInstance() { // ... 其它代码 ... // 支持OLE AfxOleInit(); // ... 其它代码 ... }</code>使用MSXML,要先新建一个MSXML2::IXMLDOMDocumentPtr类型的『文档对象』实例:
<code class="lang-cpp">// 注意对象版本要和导入的库版本一致,msxml2用DOMDocument20,msxml3用DOMDocument30,msxml4用DOMDocument40以此类推 HRESULT hr = pDoc.CreateInstance(_uuidof(MSXML2::DOMDocument30)); if (FAILED(hr)) { MessageBox("无法创建DOM文件对象,检查是否安装MS XML Parser运行库!"); return; }</code>为了读取XML文件,我们要了解几个MSXML2命名空间的常用类型。
<code class="lang-cpp">void CSettingsRWTestDlg::OnBnClickedWriteXml() { UpdateData(true); // 读取对话框输入值 MSXML2::IXMLDOMProcessingInstructionPtr pProInstruction; // XML声明 MSXML2::IXMLDOMDocumentPtr pDoc; // 文档对象 MSXML2::IXMLDOMElementPtr xmlRoot; // 根元素 HRESULT hr = pDoc.CreateInstance(_uuidof(MSXML2::DOMDocument30)); if (FAILED(hr)) { MessageBox("无法创建DOM文件对象,检查是否安装MS XML Parser运行库!"); return; } // 新建XML声明(可有可无) pProInstruction = pDoc->createProcessingInstruction("xml", "version=\"1.0\" encoding=\"utf-8\""); pDoc->appendChild(pProInstruction); xmlRoot = pDoc->createElement("MyXmlDocRoot"); // 新建根元素xmlRoot pDoc->appendChild(xmlRoot); // 向文档添加根元素 MSXML2::IXMLDOMElementPtr pNode; // 元素 pNode = pDoc->createElement("Section1"); // 新建元素Section1 pNode->setAttribute("String1", (_bstr_t)m_string1); // 设置属性String1 pNode->setAttribute("Int1", (_bstr_t)m_int1); // 设置属性Int1 xmlRoot->appendChild(pNode); // 向xmlRoot添加元素 pNode = pDoc->createElement("Section2"); // 新建元素Section2 pNode->setAttribute("String2", (_bstr_t)m_string2); // 设置属性String2 xmlRoot->appendChild(pNode); // 向xmlRoot添加元素 pDoc->save("mydoc.xml"); // 保存文档 }</code>获得的XML文档如下:
<code class="lang-cpp">void CSettingsRWTestDlg::OnBnClickedReadXml() { MSXML2::IXMLDOMDocumentPtr pDoc; // 文档对象 MSXML2::IXMLDOMElementPtr xmlRoot; // 根元素 HRESULT hr = pDoc.CreateInstance(_uuidof(MSXML2::DOMDocument30)); // 使用的msxml版本和新建对象的版本必须一致 if (FAILED(hr)) { MessageBox("无法创建DOM文件对象,检查是否安装MS XML Parser运行库!"); return; } pDoc->load("mydoc.xml"); // 读取文档 xmlRoot = pDoc->GetdocumentElement(); // 获取根元素 MSXML2::IXMLDOMNodePtr node; // 节点 MSXML2::IXMLDOMElementPtr elem; // 元素 CString tempstr; if (xmlRoot != NULL) node = xmlRoot->GetfirstChild(); // 获取第一个子节点 while (node != NULL) { // 如果找到节点 if (node->GetnodeType() == NODE_ELEMENT) { // 如果是元素节点 elem = node; // 转换类型 if (strcmp(elem->GettagName(), "Section1") == 0) { // 如果该元素是Section1 m_string1 = elem->getAttribute("String1"); // 获取属性值String1 tempstr = elem->getAttribute("Int1"); // 获取属性值Int1 m_int1 = atoi(tempstr); } else if (strcmp(elem->GettagName(), "Section2") == 0) { // 如果该元素是Section2 m_string2 = elem->getAttribute("String2"); // 获取属性值String2 } } node = node->GetnextSibling(); // 获取下一个临近节点 } UpdateData(false); // 更新对话框界面 }</code>-------- 我是例程的分割线 --------
[修改于 9年7个月前 - 2015/05/24 22:56:23]
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |
200字以内,仅用于支线交流,主线讨论请采用回复功能。