如何将对象保存到一个XML文件

gooore 2010-04-13 09:35:58
求思路,或相关文件信息皆可
...全文
340 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
oldmanzhao 2010-04-22
  • 打赏
  • 举报
回复
可以用TinyXML或者CMarkup,都是轻量级的XML组件,很管用。我们公司的产品界面布局的保存用的就是TinyXML。网上有很多示例,一搜一大把。
redsunxin 2010-04-22
  • 打赏
  • 举报
回复
bool SaveXml(BOOL bFlagSaveAs, CString strPath)
{
CString strFilePath = _T("");

if (bFlagSaveAs )
{
strFilePath.Format(_T("%s%s"),strPath,LANGUAGE_PROJECT_FILENAME);
}
else
{
strFilePath.Format(_T("%s%s"),GetProjectPath(),LANGUAGE_PROJECT_FILENAME);
}


CWaitCursor wati;
CComPtr<IXMLDOMDocument> pDoc;
HRESULT hr = pDoc.CoCreateInstance(__uuidof(DOMDocument));
if (FAILED(hr))
{
pDoc.Detach();
return false;
}
try
{
//设置根节点
CComPtr<IXMLDOMElement> xmlRoot ; //根节点
pDoc->createElement(BSTR(_T("FontTable")),&xmlRoot);
pDoc->appendChild(xmlRoot,NULL);

//Language节点
for (int i = 0 ; i < m_LanguageInfo_ary.GetSize() ; i++)
{
CString strLanID = _T("");
CString strLanHAlign = _T("");
CString strLanVAlign = _T("");

Language_Info info = m_LanguageInfo_ary.GetAt(i);
strLanID.Format(_T("%d"),info.iLanguageID);
strLanHAlign.Format(_T("%d"),info.HAlignStyle);
strLanVAlign.Format(_T("%d"),info.VAlignStyle);

//设置Language节点的属性
CComPtr<IXMLDOMElement> xmlLanElement;
hr = pDoc->createElement(BSTR(LANGUAGE_ITEM_LANGUAGE),&xmlLanElement);
xmlRoot->appendChild(xmlLanElement,NULL);
xmlLanElement->setAttribute(BSTR(_T("Name")) ,CComVariant(info.strLanguageName));
xmlLanElement->setAttribute(BSTR(_T("H_Align")) ,CComVariant(info.HAlignStyle));
xmlLanElement->setAttribute(BSTR(_T("V_Align")) ,CComVariant(info.VAlignStyle));
xmlLanElement->setAttribute(BSTR(_T("H_Offset")) ,CComVariant(info.H_Offset));
xmlLanElement->setAttribute(BSTR(_T("V_Offset")) ,CComVariant(info.V_Offset));

//创建Style节点
CResourceList::iterator it = info.StyleMgr.m_ResourceList.begin();
for (;it!=info.StyleMgr.m_ResourceList.end();it++)
{
CResourceItem* pStyleItem = (*it);
CComPtr<IXMLDOMElement> xmlStyleElement;
hr = pDoc->createElement(BSTR(_T("Style")),&xmlStyleElement);
xmlLanElement->appendChild(xmlStyleElement,NULL);
xmlStyleElement->setAttribute(BSTR(_T("Name")) ,CComVariant(pStyleItem->m_strResourceName));
xmlStyleElement->setAttribute(BSTR(_T("ImageFormat")) ,CComVariant(pStyleItem->m_nType));
xmlStyleElement->setAttribute(BSTR(LANGUAGE_STYLEATTR_RDT) ,CComVariant(pStyleItem->m_strRawDataType));

xmlStyleElement->setAttribute(BSTR(_T("UseTransColor")) ,CComVariant(pStyleItem->m_bUseTranColor));
DWORD dwColor = (DWORD)pStyleItem->m_TranColor;
xmlStyleElement->setAttribute(BSTR(_T("TransColor")) ,CComVariant(dwColor));
xmlStyleElement->setAttribute(BSTR(_T("C2CTbl")) ,CComVariant(pStyleItem->m_CCTableName));
xmlStyleElement->setAttribute(BSTR(_T("C2PTbl")) ,CComVariant(pStyleItem->m_CPTableName));
}
}

hr = pDoc->save(CComVariant(strFilePath));
CFormatXML::Format(strFilePath);
if (FAILED(hr))
{
pDoc.Detach();
return false;
}
pDoc.Detach();
}
catch (CFileException* e)
{
e->Delete();
pDoc.Detach();
return false;
}

return true;
}
sgzwiz 2010-04-22
  • 打赏
  • 举报
回复
为何不直接用MFC的序列化来保存对象

http://it.sohu.com/20040723/n221164254.shtml
gooore 2010-04-22
  • 打赏
  • 举报
回复
有没有简单的例子。

谢谢了
qinwei 2010-04-16
  • 打赏
  • 举报
回复
XML Serial 序列化 使用 MSXML2.dll
jameshooo 2010-04-15
  • 打赏
  • 举报
回复
支持序列化有很多方式,如果你的对象是COM组件,你可以选择实现IPersistStream[Init]、IPersistStorage、IPersistPropertyBag接口之一,如果你的对象是MFC类,可以直接实现序列化,如果是其它类型,序列化过程可以完全自定义
gooore 2010-04-15
  • 打赏
  • 举报
回复
up。。。。

求助
Eleven 2010-04-13
  • 打赏
  • 举报
回复
这个要你自己定义吧,你要定义要将该对象所属类的那些成员写入,如何组织该结结构。。。
jameshooo 2010-04-13
  • 打赏
  • 举报
回复
首先让对象支持序列化
序列化后的二进制数据使用某种编码(比如BASE64)转换成文本,如果本身就是文本则无需此步
把文本保存到XML中的CDATA节中
gooore 2010-04-13
  • 打赏
  • 举报
回复
请问你说的是不是让对象支持IStream接口?

你那里有例子吗?可不可以共享一个。非常感谢

[Quote=引用 1 楼 jameshooo 的回复:]
首先让对象支持序列化
序列化后的二进制数据使用某种编码(比如BASE64)转换成文本,如果本身就是文本则无需此步
把文本保存到XML中的CDATA节中
[/Quote]

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧