VC 里怎样用程序生成 XML 文档? 本帖最后由 lustersir 于 2010-04-19 15:16:19 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 VC的XML操作是通过COM接口实现的! UpdateData(); MSXML2::IXMLDOMDocumentPtr pDoc; MSXML2::IXMLDOMElementPtr xmlRoot; // 创建DOMDocument对象 HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40)); if(!SUCCEEDED(hr)) { MessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库! "); return; } // 根节点的名称为Book // 创建元素并添加到文档中 xmlRoot = pDoc->createElement((_bstr_t)"Book"); //设置属性 xmlRoot->setAttribute("id" ,(const char *)m_strId); pDoc->appendChild(xmlRoot); MSXML2::IXMLDOMElementPtr pNode; //添加“author”元素 pNode = pDoc->createElement((_bstr_t)"Author"); pNode->setAttribute("id","001"); //pNode->Puttext((_bstr_t)(const char *)m_strAuthor); xmlRoot->appendChild(pNode); MSXML2::IXMLDOMNodePtr pChildNode; //pNode->setAttribute("id","001"); pChildNode=pDoc->createElement((_bstr_t)"Sex"); pChildNode->text="man"; pNode->appendChild(pChildNode); // 添加“Title”元素 pNode = pDoc -> createElement("Author");// pNode->Puttext((const char *)m_strTitle); xmlRoot->appendChild(pNode); pChildNode=pDoc->createElement((_bstr_t)"Language"); pChildNode->text="China"; pNode->appendChild(pChildNode); // 保存到文件 // 如果不存在就建立,存在就覆盖 pDoc->save("d:\\he.xml"); 要初始化COM 谢谢大家指点,最后还是用了微软的 MSXML Parser谢谢 etz2008 给我的代码,虽然我刚才已经找到了差不多的一个例子弄明白了,但你给我的例子比我找的更丰富一点,我找的那个太苍白啦,但还是要把我调通的小例子一起贴上来,以供其他人参考。#include "stdafx.h" #include "iostream.h" #include "atlbase.h" #import "msxml6.dll" //引入类型库 using namespace MSXML2;//using namespace std;void LoadFromString(); void CreateXML(); //XML文本模板 _bstr_t XMLTemple="<China><Beijing>-11</Beijing><Shanghai Weather=\"Cloudy\">9</Shanghai></China>"; int main() { CoInitialize(NULL); //初始化COM 环境 CreateXML(); LoadFromString(); CoUninitialize(); system("PAUSE"); return 0; } void CreateXML(){ cout << "------生成新的XML文本 ------" << endl; //MSXML2:: IXMLDOMDocumentPtr pDoc; HRESULT hr =pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument)); /*格式:__uuidof(表达式) __uuidof关键字用来获得表达式的GUID。这个表达式可以是一种类型名称、一个指针、引用或者一个类型的数组、一个有这个类型实例化的模板或者这种类型的变量。只要编译器能使用该参数获得相关的GUID,那么该参数就是有效的。 这个参数的特殊情况就是它取0或NULL的时候。在这种情况下,__uuidof会返回一个由0组成的GUID。可以使用这一关键字来提取一个对象uuid扩展属性的GUID。*/ if(!SUCCEEDED(hr)) { cout << "无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!" << endl; system("PAUSE"); } //MSXML2:: IXMLDOMElementPtr pDocElement=pDoc->createElement("China"); pDoc->appendChild(pDocElement); cout << "生成树根:\n" << pDoc->xml << endl; //MSXML2:: 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; pDoc->save("c:\\Test.xml"); pDocElement->removeChild (pNewChildElement); cout << "把刚加入的节点删除:\n" << pDoc->xml << endl; } void LoadFromString() { cout << "------读取已有XML文本 ------" << endl; //MSXML2:: IXMLDOMDocumentPtr pDoc; HRESULT hr =pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument)); if(!SUCCEEDED(hr)) { cout << "无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!" << endl; system("PAUSE"); } pDoc->loadXML(XMLTemple); cout << "读取结果:\n" << pDoc->xml << endl; //MSXML2:: IXMLDOMElementPtr pDocElement=pDoc->GetdocumentElement(); //MSXML2:: IXMLDOMElementPtr pElement=pDocElement->selectSingleNode("Shanghai"); pDocElement->removeChild(pElement); cout << "定位删除Shanghai节点:\n" << pDoc->xml << endl; cout << "保存结果 Save .....(模拟而已)" << endl; cout << "\n 好了,就这么简单" << endl; } 希望高手们给我一点提示,自动根据xml写的结构定义导出头文件.h 一个从没考虑的的简单问题 一个编译错误! COM问题,帮我看看 请帮忙解答一个API程序的问题 请教高手一个关于不规则区域内外点判断算法的问题. 请做过图片编辑程序的哥们进. 关于TreeCtrl的一个怪问题. 询问一个访问远程数据库的问题 在用MCI播放midi时如何能获得当前播放midi曲目的时间长度? FileOperation函数在全路径下野无法删除文件 请问:为什么 读取USB信息中CreateFile返回INVALID_HANDLE_VALUE
MSXML2::IXMLDOMDocumentPtr pDoc;
MSXML2::IXMLDOMElementPtr xmlRoot;
// 创建DOMDocument对象
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));
if(!SUCCEEDED(hr))
{
MessageBox("无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库! ");
return;
} // 根节点的名称为Book
// 创建元素并添加到文档中
xmlRoot = pDoc->createElement((_bstr_t)"Book");
//设置属性
xmlRoot->setAttribute("id" ,(const char *)m_strId);
pDoc->appendChild(xmlRoot);
MSXML2::IXMLDOMElementPtr pNode;
//添加“author”元素
pNode = pDoc->createElement((_bstr_t)"Author");
pNode->setAttribute("id","001");
//pNode->Puttext((_bstr_t)(const char *)m_strAuthor);
xmlRoot->appendChild(pNode);
MSXML2::IXMLDOMNodePtr pChildNode;
//pNode->setAttribute("id","001");
pChildNode=pDoc->createElement((_bstr_t)"Sex");
pChildNode->text="man";
pNode->appendChild(pChildNode);
// 添加“Title”元素
pNode = pDoc -> createElement("Author");
// pNode->Puttext((const char *)m_strTitle);
xmlRoot->appendChild(pNode);
pChildNode=pDoc->createElement((_bstr_t)"Language");
pChildNode->text="China";
pNode->appendChild(pChildNode);
// 保存到文件
// 如果不存在就建立,存在就覆盖
pDoc->save("d:\\he.xml");
要初始化COM
#include "iostream.h"
#include "atlbase.h"
#import "msxml6.dll" //引入类型库 using namespace MSXML2;
//using namespace std;void LoadFromString();
void CreateXML(); //XML文本模板
_bstr_t XMLTemple="<China><Beijing>-11</Beijing><Shanghai Weather=\"Cloudy\">9</Shanghai></China>";
int main()
{
CoInitialize(NULL); //初始化COM 环境 CreateXML();
LoadFromString(); CoUninitialize();
system("PAUSE");
return 0;
} void CreateXML()
{
cout << "------生成新的XML文本 ------" << endl; //MSXML2::
IXMLDOMDocumentPtr pDoc;
HRESULT hr =pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument));
/*格式:__uuidof(表达式)
__uuidof关键字用来获得表达式的GUID。这个表达式可以是一种类型名称、一个指针、引用或者一个类型的数组、一个有这个类型实例化的模板或者这种类型的变量。只要编译器能使用该参数获得相关的GUID,那么该参数就是有效的。
这个参数的特殊情况就是它取0或NULL的时候。在这种情况下,__uuidof会返回一个由0组成的GUID。
可以使用这一关键字来提取一个对象uuid扩展属性的GUID。*/ if(!SUCCEEDED(hr))
{
cout << "无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!" << endl;
system("PAUSE");
}
//MSXML2::
IXMLDOMElementPtr pDocElement=pDoc->createElement("China");
pDoc->appendChild(pDocElement);
cout << "生成树根:\n" << pDoc->xml << endl;
//MSXML2::
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; pDoc->save("c:\\Test.xml"); pDocElement->removeChild (pNewChildElement);
cout << "把刚加入的节点删除:\n" << pDoc->xml << endl;
} void LoadFromString()
{
cout << "------读取已有XML文本 ------" << endl;
//MSXML2::
IXMLDOMDocumentPtr pDoc;
HRESULT hr =pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument));
if(!SUCCEEDED(hr))
{
cout << "无法创建DOMDocument对象,请检查是否安装了MS XML Parser 运行库!" << endl;
system("PAUSE");
} pDoc->loadXML(XMLTemple);
cout << "读取结果:\n" << pDoc->xml << endl;
//MSXML2::
IXMLDOMElementPtr pDocElement=pDoc->GetdocumentElement();
//MSXML2::
IXMLDOMElementPtr pElement=pDocElement->selectSingleNode("Shanghai");
pDocElement->removeChild(pElement);
cout << "定位删除Shanghai节点:\n" << pDoc->xml << endl;
cout << "保存结果 Save .....(模拟而已)" << endl;
cout << "\n 好了,就这么简单" << endl;
}