怎么使用XMLDOMDocument生成一段xml代码?

举个小例子即可
2025-02-25 03:36:38
推荐回答(3个)
回答1:

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如下:

WuHanShangHai

---------------还有个例子
#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;

}

回答2:

google
XMLDOMDocument xml 生成

回答3:

/* 这个程序只能在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;
}