CPP读写XML

本文对比了CPP与JAVA在处理XML方面的差异,介绍了TinyXML和MSXML两种CPP中常用的XML处理库,并提供了示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在CPP中读写XML比在JAVA中来的麻烦,就光是一个字符串的处理就比JAVA麻烦许多。JAVA比较统一,一个String就搞定所有字符串。但是CPP中,什么std::string,CString,char*,就没有一个统一一点的字符串类型。
在JAVA中读写XML可以采用的类库很多,比如DOM4J(目前比较常用的)。
而在CPP中,可以采用目前比较流行的两个,TinyXML和MSXML。
1.TinyXML(开源的)。这个东西比较简单,但简单又简单的坏处,虽然说用起来很方便,但是在MFC应用中,容易出错(MS就是因为字符串处理的问题,还有些其他小问题),我在MFC中使用的时候,就会出现许多编译时错误。这里就简单写一下TinyXML的应用。
首先下载,然后编译(Release),得到一个tinyxml.lib(debug下得到的是tinyxmlld.lib),把这个拷贝到你的工程目录下,然后再拷贝tinyxml.h 和tinystr.h到工程目录下。
(这里用一个win32控制台应用程序为例子)。
#pragma comment(lib,"tinyxml.lib")
#include "tinyxml.h"
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
int main()
{
TiXmlDocument doc("test.xml");
if(!doc.LoadFile()){
  cout<<"test.xml does not exist!"<<endl;
  getch();
  return 1;
}
TiXmlElement* root=doc.RootElement();
TiXmlElement* company=root->FirstChildElement("company");
TiXmlElement* name=company->FirstChildElement("name");
TiXmlText text("sweet");
name->ReplaceChild(name->FirstChild(name->GetText()),text);
if(doc.SaveFile())
{
  cout<<"save success"<<endl;
}else
{
  cout<<"error!"<<endl;
}
getch();//由于IDE是vs2005,调试运行时一闪而过,所以还是用TC中的老方法。
return 0;
}
需要注意的是在TinyXML当中,值的设置用的是insertChild方法(没有JAVA中的set方法,替换的话需要用到replaceChild方法)
2.MSXML,这是微软的一套读写XML的控件。目前最新版本是6,用他就比较麻烦,但是比较稳定,适合比较复杂的XML文件或者在MFC中使用。下面是MFC中的代码片断:
BOOL CMsMfcDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
  CString strAboutMenu;
  strAboutMenu.LoadString(IDS_ABOUTBOX);
  if (!strAboutMenu.IsEmpty())
  {
   pSysMenu->AppendMenu(MF_SEPARATOR);
   pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  }
}
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
//  执行此操作
SetIcon(m_hIcon, TRUE);   // 设置大图标
SetIcon(m_hIcon, FALSE);  // 设置小图标
// TODO: 在此添加额外的初始化代码
CoInitialize(NULL);
MSXML2::IXMLDOMDocument3Ptr pDoc;
HRESULT hr;
hr=pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument60));
if(FAILED(hr)){
  MessageBox((CString)"Can't Create Document!");
  return 1;
}
pDoc->load("test.xml");
MSXML2::IXMLDOMNodePtr pNode=pDoc->selectSingleNode("//name");
CString str=pNode->Gettext();
this->SetDlgItemTextW(IDC_TEST,str);
return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
这是MFC的初始化方法,在TODO下就是读取XML并让他显示在一个静态文本框内。这个要设置文本的话,就不需要像TinyXML那用调用replace方法了,它提供一个PutText方法允许你直接设置文本并用sava方法来保存(注意保存方法需要制定路径和文件名,如果存在就替换,不存在就新建)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值