C++解析xml文档或者xml字符串方法

由于在javascript中不存在指针概念,故在xml页面调用OCX控件时,以前控件中的输出参数通过指针返回在这样的情况下行不通了,但本来就有返回参数,以及在同时有多个输出参数的情况下,依然想通过返回值返回,那就需要进行处理,然而怎么去处理呢?通过研究发现通过xml形式的字符串返回是一种解决方案,在解决这样的返回值的同时突然发现其实如果输入参数是结构体的话,也可以通过xml字符串的形式传入。然而怎么去解析它呢,而又怎么去做一个xml字符串呢,通过研究学习,以下是当然已有的解决方案。
开发环境:VS2010
    一、解析xml文件:

假如已存在一个xml文件classfile.xml


#import "msxml3.dll"
using namespace MSXML2;
void CannilyxmlDlg::OnBnClickedButton1()
{
 // TODO: 在此添加控件通知处理程序代码
 MSXML2::IXMLDOMDocumentPtr xmldoc;
 HRESULT hr;
 hr = CoInitialize(NULL);//必须初始化,否则后面的CreateInstance创建文档要失败
 if(FAILED (hr))//此处最好用FAILED或者SUCCEEDED来判断,否则可能引起未知错误
 {
  MessageBox("初始化COM失败");
 }
 else
 {
  MessageBox("初始化COM成功");
 }
 hr = xmldoc.CreateInstance(__uuidof(MSXML2::DOMDocument));
 if(FAILED (hr))
 {
  MessageBox("创建xml文档对象失败");
 }
 else
 {
  MessageBox("创建xml文档对象成功");
 }
 xmldoc->load("classfile.xml");//此语句非常非常重要,和解析xml字符串语句只有点点区别,但引起的错误却是千差万别
 MSXML2::IXMLDOMElementPtr root;
 MSXML2::IXMLDOMNodeListPtr nodelist;
 MSXML2::IXMLDOMNodeListPtr childnodelist;
 root = xmldoc->GetdocumentElement();
 nodelist = root->GetchildNodes();
 MSXML2::IXMLDOMNodePtr node;
 MSXML2::IXMLDOMNodePtr childnode;
 for(int i=0;i<nodelist->length;i++)
 {
  node = nodelist->Getitem(i);
  childnodelist = node->GetchildNodes();
  for(int j=0;j<childnodelist->length;j++)
  {
   childnode = childnodelist->Getitem(i);
   MessageBox(childnode->Gettext());
  }
 }
 ::CoUninitialize();
}


二、解析xml字符串 
 调用端:
void xmld()
{
    char *info = "<?xml version = '1.0'?>\n\
    <Video>\n\    
    <data>12</data>\n\    
    </Video>" ;//传入一个xml形式的字符串
     BSTR mation = _bstr_t(info);//将上述指针类型字符串 转化为BSTR类型
    RealPlay(mation); //调用函数,传入一个字符类型参数                        

被调用端:
#import "msxml3.dll"
using namespace MSXML2;
void RealPlay(LPCTSTR msg)
{
 // TODO: 在此添加控件通知处理程序代码
 MSXML2::IXMLDOMDocumentPtr xmldoc;
 HRESULT hr;
 hr = CoInitialize(NULL);//必须初始化,否则后面的CreateInstance创建文档要失败
 if(FAILED (hr))//此处最好用FAILED或者SUCCEEDED来判断,否则可能引起未知错误
 {
  MessageBox("初始化COM失败");
 }
 else
 {
  MessageBox("初始化COM成功");
 }
 hr = xmldoc.CreateInstance(__uuidof(MSXML2::DOMDocument));
 if(FAILED (hr))
 {
  MessageBox("创建xml文档对象失败");
 }
 else
 {
  MessageBox("创建xml文档对象成功");
 }
 xmldoc->loadXML(msg);//此语句非常非常重要,和解析xml文件语句只有点点区别,但引起的错误却是千差万别
 MSXML2::IXMLDOMElementPtr root;
 MSXML2::IXMLDOMNodeListPtr nodelist;
 MSXML2::IXMLDOMNodeListPtr childnodelist;
 root = xmldoc->GetdocumentElement();
 nodelist = root->GetchildNodes();
 MSXML2::IXMLDOMNodePtr node;
 MSXML2::IXMLDOMNodePtr childnode;
 for(int i=0;i<nodelist->length;i++)
 {
  node = nodelist->Getitem(i);
  childnodelist = node->GetchildNodes();
  for(int j=0;j<childnodelist->length;j++)
  {
   childnode = childnodelist->Getitem(i);
   MessageBox(childnode->Gettext());
  }
 }
 ::CoUninitialize();
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SunkingYang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值