1.
BOOL CXmlApp::InitInstance()
{
AfxOleInit();
...
}
2.
#import
3.
void CXmlDlg::OnButton1()
{
// TODO: Add your control notification handler code here
MSXML2::IXMLDOMDocumentPtr pDoc;
MSXML2::IXMLDOMElementPtr xmlRoot ;
//创建DOMDocument对象
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));
if(!SUCCEEDED(hr))
{
MessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!");
}
//根节点的名称为china
pDoc->raw_createElement((_bstr_t)(char*)"china", &xmlRoot);
pDoc->raw_appendChild(xmlRoot, NULL);
MSXML2::IXMLDOMElementPtr childNode ;
pDoc->raw_createElement((_bstr_t)(char*)"City", &childNode);
childNode->Puttext("WuHan");//节点值
childNode->setAttribute("population","8,000,000");//属性名,属性值
childNode->setAttribute("area","10000");
xmlRoot->appendChild(childNode);
pDoc->raw_createElement((_bstr_t)(char*)"City", &childNode);
childNode->Puttext("ShangHai");
childNode->setAttribute("population","12,000,000");
childNode->setAttribute("area","12000");
xmlRoot->appendChild(childNode);
//保存到文件
//如果不存在就建立,存在就覆盖
pDoc->save("f:\he.xml");
}
生成的he.xml如下:
---------------还有个例子
#include "stdafx.h"
#include "iostream.h"
#include "msxml.h"
#include "atlbase.h"
#import "msxml.dll" //引入类型库
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
int Exit();
void LoadFromString();
void CreateXML();
//XML文本模板
_bstr_t XMLTemple=" -11 9 ";
int main()
{
cout << " XML编程--示范程序 " << endl;
CoInitialize(NULL); //初始化COM 环境
cout << "------生成新的XML文本 ------" << endl;
CreateXML();
cout << "------读取已有XML文本 ------" << endl;
LoadFromString();
return Exit();
}
void CreateXML()
{
MSXML::IXMLDOMDocumentPtr pDoc;
HRESULT hr =pDoc.CreateInstance(__uuidof(MSXML::DOMDocument));
if(!SUCCEEDED(hr))
{
cout << "无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!" << endl;
Exit();
}
MSXML::IXMLDOMElementPtr pDocElement=pDoc->createElement("China");
pDoc->appendChild(pDocElement);
cout << "生成树根:\n" << pDoc->xml << endl;
MSXML::IXMLDOMElementPtr pNewChildElement;
pNewChildElement=pDoc->createElement("Beijing");
pNewChildElement->Puttext("-11");
pDocElement->appendChild(pNewChildElement);
cout << "添加节点:\n" << pDoc->xml << endl;
pNewChildElement=pDoc->createElement("Shanghai");
pNewChildElement->Puttext("9");
pNewChildElement->setAttribute("Weather",_variant_t("Cloudy"));
pDocElement->appendChild(pNewChildElement);
cout << "再添加节点:\n" << pDoc->xml << endl;
pDocElement->removeChild (pNewChildElement);
cout << "把刚加入的节点删除:\n" << pDoc->xml << endl;
}
void LoadFromString()
{
MSXML::IXMLDOMDocumentPtr pDoc;
HRESULT hr =pDoc.CreateInstance(__uuidof(MSXML::DOMDocument));
if(!SUCCEEDED(hr))
{
cout << "无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!" << endl;
Exit();
}
pDoc->loadXML(XMLTemple);
cout << "读取结果:\n" << pDoc->xml << endl;
MSXML::IXMLDOMElementPtr pDocElement=pDoc->GetdocumentElement();
MSXML::IXMLDOMElementPtr pElement=pDocElement->selectSingleNode("Shanghai");
pDocElement->removeChild(pElement);
cout << "定位删除Shanghai节点:\n" << pDoc->xml << endl;
cout << "保存结果 Save .....(模拟而已)" << endl;
cout << "\n 好了,就这么简单" << endl;
}
int Exit()
{
getchar();
return 1;
}
google
XMLDOMDocument xml 生成
/* 这个程序只能在C编译器下编译成功, 请确保源文件的扩展名为c */
#define COBJMACROS
#include
#include
#include
#pragma comment(lib, "msxml6.lib")
// char *转BSTR
// 用完后调用SysFreeString释放
BSTR convert_string_to_bstr(const char *s)
{
int n;
wchar_t *ws;
BSTR bstr = NULL;
n = MultiByteToWideChar(CP_ACP, 0, s, -1, NULL, 0);
ws = malloc(n * sizeof(wchar_t));
if (ws != NULL)
{
MultiByteToWideChar(CP_ACP, 0, s, -1, ws, n);
bstr = SysAllocString(ws);
free(ws);
}
return bstr;
}
// BSTR转char *
// 用完后调用free释放
char *convert_bstr_to_string(BSTR bstr)
{
char *s;
int n;
n = WideCharToMultiByte(CP_ACP, 0, bstr, -1, NULL, 0, NULL, NULL);
s = malloc(n);
if (s != NULL)
WideCharToMultiByte(CP_ACP, 0, bstr, -1, s, n, NULL, NULL);
return s;
}
void create_header(IXMLDOMDocument *xmldoc)
{
BSTR target, data;
IXMLDOMNode *header_node;
IXMLDOMProcessingInstruction *header;
// 创建XML文档头节点
target = convert_string_to_bstr("xml");
data = convert_string_to_bstr("version=\"1.0\" encoding=\"utf-8\"");
IXMLDOMDocument_createProcessingInstruction(xmldoc, target, data, &header);
SysFreeString(target);
SysFreeString(data);
// header转换成node, 然后添加进文档
// 注意旧的header对象和新产生的node对象都要释放
IXMLDOMProcessingInstruction_QueryInterface(header, &IID_IXMLDOMNode, &header_node);
IXMLDOMProcessingInstruction_Release(header);
IXMLDOMDocument_appendChild(xmldoc, header_node, NULL); // 最后一个参数是输出参数, 没有用
IXMLDOMNode_Release(header_node);
}
IXMLDOMElement *create_root(IXMLDOMDocument *xmldoc)
{
char timestr[30];
struct tm tm;
time_t t;
BSTR name;
IXMLDOMElement *root;
IXMLDOMNode *root_node;
VARIANT value;
// 创建根节点
name = convert_string_to_bstr("data");
IXMLDOMDocument_createElement(xmldoc, name, &root);
SysFreeString(name);
// 将创建的根节点添加到文档中
IXMLDOMElement_QueryInterface(root, &IID_IXMLDOMNode, &root_node);
IXMLDOMDocument_appendChild(xmldoc, root_node, NULL);
IXMLDOMNode_Release(root_node);
// 获取当前时间
time(&t);
localtime_s(&tm, &t);
strftime(timestr, sizeof(timestr), "%Y-%m-%d %H:%M:%S", &tm);
// 在根节点上添加一个属性
name = convert_string_to_bstr("timestr");
value.bstrVal = convert_string_to_bstr(timestr);
value.vt = VT_BSTR;
IXMLDOMElement_setAttribute(root, name, value);
SysFreeString(name);
SysFreeString(value.bstrVal);
return root;
}
void add_post(IXMLDOMDocument *xmldoc, IXMLDOMElement *root, const char *name, const char *text)
{
BSTR attrname_bstr;
BSTR nodename_bstr;
BSTR text_bstr;
IXMLDOMElement *elem;
IXMLDOMNode *node;
VARIANT value;
nodename_bstr = convert_string_to_bstr("post");
IXMLDOMDocument_createElement(xmldoc, nodename_bstr, &elem); // 创建element
SysFreeString(nodename_bstr);
IXMLDOMElement_QueryInterface(elem, &IID_IXMLDOMNode, &node); // element转node
IXMLDOMElement_appendChild(root, node, NULL);
// 添加name属性
attrname_bstr = convert_string_to_bstr("name");
value.bstrVal = convert_string_to_bstr(name);
value.vt = VT_BSTR;
IXMLDOMElement_setAttribute(elem, attrname_bstr, value);
SysFreeString(attrname_bstr);
SysFreeString(value.bstrVal);
// 添加节点内文本
text_bstr = convert_string_to_bstr(text);
IXMLDOMElement_put_text(elem, text_bstr);
SysFreeString(text_bstr);
// 释放element和node对象
// 请注意element是node的子类, 换句话说element是一种node
IXMLDOMElement_Release(elem);
IXMLDOMNode_Release(node);
}
void write_xml(IXMLDOMDocument *xmldoc)
{
IXMLDOMElement *root;
create_header(xmldoc);
root = create_root(xmldoc);
add_post(xmldoc, root, "配置“Debug|Win32”", "将平台工具集更改为“v143”(之前为“v100”)。");
add_post(xmldoc, root, "配置“Debug|x64”", "将平台工具集更改为“v143”(之前为“v100”)。");
add_post(xmldoc, root, "配置“Release|Win32”", "将平台工具集更改为“v143”(之前为“v100”)。");
add_post(xmldoc, root, "配置“Release|x64”", "将平台工具集更改为“v143”(之前为“v100”)。");
add_post(xmldoc, root, "正在升级项目“xmltest”...", "重定目标结束: 1 个已完成,0 个未通过,0 个已跳过");
IXMLDOMElement_Release(root);
}
// 创建XML字符串
void create_xml_str()
{
char *xmlstr;
BSTR bstr;
HRESULT hr;
IXMLDOMDocument *xmldoc;
hr = CoCreateInstance(&CLSID_DOMDocument60, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, &xmldoc);
if (SUCCEEDED(hr))
{
write_xml(xmldoc);
IXMLDOMDocument_get_xml(xmldoc, &bstr);
xmlstr = convert_bstr_to_string(bstr);
SysFreeString(bstr);
printf("%s\n", xmlstr);
free(xmlstr);
IXMLDOMDocument_Release(xmldoc);
}
}
int main()
{
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); // 初始化COM组件对象模型
create_xml_str();
CoUninitialize();
return 0;
}