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'?>
    <Video>     
    <data>12</data>     
    </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();
} 


原文地址:https://www.cnblogs.com/SunkingYang/p/11049258.html