XML是通用的数据存储格式,默认使用UTF-8字符集。
对于绿色版(不写注册表)的程序,XML也可以用来储存配置信息。
对于绿色版(不写注册表)的程序,XML也可以用来储存配置信息。
// 此处也可以是msxml2或msxml4等,哪个可以编译通过就用哪个
// 无论2、3、4,命名空间都是MSXML2
#import <msxml3.dll></msxml3.dll>然后在CxxxxxApp的InitInstance()中加入OLE支持:BOOL CSettingsRWTestApp::InitInstance()
{
// ... 其它代码 ...
// 支持OLE
AfxOleInit();
// ... 其它代码 ...
}使用MSXML,要先新建一个MSXML2::IXMLDOMDocumentPtr类型的『文档对象』实例:// 注意对象版本要和导入的库版本一致,msxml2用DOMDocument20,msxml3用DOMDocument30,msxml4用DOMDocument40以此类推
HRESULT hr = pDoc.CreateInstance(_uuidof(MSXML2::DOMDocument30));
if (FAILED(hr))
{
MessageBox("无法创建DOM文件对象,检查是否安装MS XML Parser运行库!");
return;
}为了读取XML文件,我们要了解几个MSXML2命名空间的常用类型。
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"); // 保存文档
}获得的XML文档如下:
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); // 更新对话框界面
}-------- 我是例程的分割线 --------