VC解析XML--使用CMarkup类解析XML .

VC使用Cmarkup生成、解析xml资料 【分享一下】 里面内容很多。。 觉得好就下吧 Cmarkup是依据EDOM的,这是这个简单XML分析的关键。EDOM是操作XML元素、属性和数据的简明方法集。当你不需要复杂的XML特性时,它避免你读大量的DOM和SAX文档。 如果你希望使用微软的MSXML,CMarkup工程中CmarkupMSXML类全面的演示了通过EDOM来使用MSXML,并且它是以C++ COM语法开始。 下面列出了CMarkup的特征: 独立:不需要任何外部的XML组件。 小:编译到你的工程只是很小的一个类,并且对于文档只维持了一个字符串,以及一个总计小于字符串内存大小的索引数组。 快:分析器在相当快的建立索引数组。 简单:EDOM方法使创建、导航和修改XML无比的简单。 MSXML:CMarkupMSXML类用EDOM方法包装了微软的XML服务。MSXML编译选项用来演示这个类。 UNICODE(统一字符编码标准):对于WindowsNT和WindowsCE平台能够被编译成UNICODE,在WindowsNT UNICODE下,XML文档是流到UTF-8文件中,但是内部用宽字符。 UTF-8:对于UTF-8文件,这接受和返回UTF-8字符串(确保_MBCS没有被定义) MBCS:对于双字节数据(定义_MBCS),它不与UTF-8兼容. STL:CMarkupSTL类完全没有使用MFC,它的演示要使用STL编译选项。 立即下载
 

经过今天尝试MFC解析XML串,也算有了不少收获,总结一下。
         我是使用的CMarkup类对XML进行操作。
         
         CMarkup好象都是先从一个xml文件里面把内容读出来,再进行解析,搞得我恨不得要把我的CString写到xml文件里面再取出来了。
         如果需要直接读取CString,可以直接用

         CMarkup::SetDoc方法。
         最后其他的方法转载别人的使用例子,写得很全。
来自http://hi.baidu.com/yxifu/blog/item/fa1569225bda52a44623e8f0.html

(一) 先讲一下XML中的物殊字符,手动填写时注意一下。

字符                  字符实体
&                      &或&
'                      '或'
>                      >或>
<                      &lt;或&<
"                       &quot;或"

(二) CMarkup类的源代码。

这是目前的最新版本;

这是官网示例文件,取出里面的Markup.cpp和Markup.h,导入你的工程里面,CMarkup类就可以用了;

下载地址:http://www.firstobject.com/Markup83.zip

(三) 创建一个XML文档。

CMarkup xml;
xml.AddElem( "ORDER" );
xml.AddChildElem( "ITEM" );
xml.IntoElem();
xml.AddChildElem( "SN", "132487A-J" );
xml.AddChildElem( "NAME", "crank casing" );
xml.AddChildElem( "QTY", "1" );
xml.Save("c://UserInfo.xml");

效果如下:

<ORDER> 
<ITEM> 
<SN>132487A-J</SN> 
<NAME>crank casing</NAME> 
<QTY>1</QTY> 
</ITEM> 
</ORDER>
(四) 浏览特定元素
CMarkup xml; 
xml.Load("UserInfo.xml");
while ( xml.FindChildElem("ITEM") ) 
{     
	xml.IntoElem();     
	xml.FindChildElem( "SN" );     
	CString csSN = xml.GetChildData();     
	xml.FindChildElem( "QTY" );     
	int nQty = atoi( xml.GetChildData() );     
	xml.OutOfElem(); 
}
(五)增加元素和属性
添加在最后面,使用的是AddElem;添加在最前面,使用InsertElem。
CMarkup xml;
xml.Load("c://UserInfo.xml"); 
xml.AddElem( "ORDER" ); 
xml.IntoElem(); // 进入 ORDER
xml.AddElem( "ITEM" );     
xml.IntoElem(); // 进入 ITEM     
xml.AddElem( "SN", "4238764-A" ); 
//添加元素     
xml.AddElem( "NAME", "bearing" );
//添加元素     
xml.AddElem( "QTY", "15" );
//添加元素     
xml.OutOfElem(); // 退出 ITEM 
xml.AddElem( "SHIPMENT" ); 
xml.IntoElem(); // 进入 SHIPMENT 
xml.AddElem( "POC" );//添加元素 
xml.SetAttrib( "type", "non-emergency"); //添加属性 
xml.IntoElem(); // 进入 POC 
xml.AddElem( "NAME", "John Smith"); //添加元素 
xml.AddElem( "TEL", "555-1234"); //添加元素 
xml.Save("c://UserInfo.xml");

 

效果如下:

<ORDER> 
<ITEM> <SN>132487A-J</SN> 
<NAME>crank casing</NAME> 
<QTY>1</QTY> 
</ITEM> 
<ITEM> <SN>4238764-A</SN> 
<NAME>bearing</NAME> 
<QTY>15</QTY> </ITEM> 
<SHIPMENT> <POC type="non-emergency"> 
<NAME>John Smith</NAME> <TEL>555-1234</TEL> 
</POC> 
</SHIPMENT> 
</ORDER>

(六) 修改元素和属性

如将POC中的属性type改成:change;

元素TEL改成:123456789

 CMarkup xml;
 if (xml.Load("UserInfo.xml"))
 {
  CString strUserID = _T("");
  xml.ResetMainPos();
  if (xml.FindChildElem("SHIPMENT"))
  {
   xml.IntoElem();
   if (xml.FindChildElem("POC"))
   {
    xml.IntoElem();
    CString str_type=xml.GetAttrib("type");
    MessageBox(str_type);
    xml.SetAttrib("type","change");
    strUserID = xml.GetData();
    
    if (xml.FindChildElem("TEL"))
    {
     xml.IntoElem();
     xml.SetData("123456789");
     xml.Save("UserInfo.xml");
     return;
    }
   }
  }
 }

(七)删除元素:

删除SN=132487A-J的项目。

CMarkup xml;
 if (xml.Load("UserInfo.xml"))
 {
  CString strUserID = _T("");
  xml.ResetMainPos();
  if (xml.FindChildElem("ITEM"))
  {
   xml.IntoElem();
   CString str_sn;
   xml.FindChildElem("SN");
   str_sn=xml.GetChildData();
   if(str_sn=="132487A-J")
   {
    xml.RemoveElem();
    xml.Save("UserInfo.xml");
   }
  }
 }

 

 

 

乐吾天修改:

进过测试,上述有问题,在重新插入一个元素的时候,有问题,不是使用方法AddElem,而是使用FindElem,如下:

 

(五)增加元素和属性
添加在最后面,使用的是AddElem;添加在最前面,使用InsertElem。
CMarkup xml;
xml.Load("c://UserInfo.xml"); 
xml.FindElem( "ORDER" ); //vc6.0里面,此处要进行修改,不是使用xml.AddElem( "ORDER" );
xml.IntoElem(); // 进入 ORDER
 
xml.AddElem( "ITEM" );     
xml.IntoElem(); // 进入 ITEM     
xml.AddElem( "SN", "4238764-A" ); //添加元素     
xml.AddElem( "NAME", "bearing" );//添加元素     
xml.AddElem( "QTY", "15" );//添加元素     
xml.OutOfElem(); // 退出 ITEM 
xml.AddElem( "SHIPMENT" ); 
xml.IntoElem(); // 进入 SHIPMENT 
xml.AddElem( "POC" );//添加元素 
xml.SetAttrib( "type", "non-emergency");//添加属性 
xml.IntoElem(); // 进入 POC 
xml.AddElem( "NAME", "John Smith");//添加元素 
xml.AddElem( "TEL", "555-1234");//添加元素 
xml.Save("c://UserInfo.xml");

 

效果如下:

<ORDER> 
<ITEM> <SN>132487A-J</SN> 
<NAME>crank casing</NAME> 
<QTY>1</QTY> 
</ITEM> <ITEM> 
<SN>4238764-A</SN> 
<NAME>bearing</NAME> 
<QTY>15</QTY> 
</ITEM> 
<SHIPMENT> 
<POC type="non-emergency"> 
<NAME>John Smith</NAME> 
<TEL>555-1234</TEL> 
</POC> 
</SHIPMENT> 
</ORDER>
cmarkup 解析 xml VC解析XML--使用CMarkup类解析XML (一) 先讲一下XML中的物殊字符,手动填写时注意一下。 字符 字符实体 & &或&#38; ' &apos;或' > >或> < <或&< " "或" (二) CMarkup类的源代码。 这是目前的最新版本; 取出里面的Markup.cpp和Markup.h,导入你的工程里面,CMarkup类就可以用了; (三) 创建一个XML文档。 CMarkup xml; xml.AddElem( "ORDER" ); xml.AddChildElem( "ITEM" ); xml.IntoElem(); xml.AddChildElem( "SN", "132487A-J" ); xml.AddChildElem( "NAME", "crank casing" ); xml.AddChildElem( "QTY", "1" ); xml.Save("c:\\UserInfo.xml"); 效果如下: <ORDER> <ITEM> <SN>132487A-J</SN> <NAME>crank casing</NAME> <QTY>1</QTY> </ITEM> </ORDER>(四) 浏览特定元素CMarkup xml; xml.Load("UserInfo.xml");while ( xml.FindChildElem("ITEM") ) { xml.IntoElem(); xml.FindChildElem( "SN" ); CString csSN = xml.GetChildData(); xml.FindChildElem( "QTY" ); int nQty = atoi( xml.GetChildData() ); xml.OutOfElem(); }(五)增加元素和属性添加在最后面,使用的是AddElem;添加在最前面,使用InsertElem。CMarkup xml;xml.Load("c:\\UserInfo.xml"); xml.AddElem( "ORDER" ); xml.IntoElem(); // 进入 ORDER xml.AddElem( "ITEM" ); xml.IntoElem(); // 进入 ITEM xml.AddElem( "SN", "4238764-A" ); //添加元素 xml.AddElem( "NAME", "bearing" );//添加元素 xml.AddElem( "QTY", "15" );//添加元素 xml.OutOfElem(); // 退出 ITEM xml.AddElem( "SHIPMENT" ); xml.IntoElem(); // 进入 SHIPMENT xml.AddElem( "POC" );//添加元素 xml.SetAttrib( "type", "non-emergency");//添加属性 xml.IntoElem(); // 进入 POC xml.AddElem( "NAME", "John Smith");//添加元素 xml.AddElem( "TEL", "555-1234");//添加元素 xml.Save("c:\\UserInfo.xml"); 效果如下: <ORDER> <ITEM> <SN>132487A-J</SN> <NAME>crank casing</NAME> <QTY>1</QTY> </ITEM> <ITEM> <SN>4238764-A</SN> <NAME>bearing</NAME> <QTY>15</QTY> </ITEM> <SHIPMENT> <POC type="non-emergency"> <NAME>John Smith</NAME> <TEL>555-1234</TEL> </POC> </SHIPMENT> </ORDER>(六) 修改元素和属性 如将POC中的属性type改成:change; 元素TEL改成:123456789 CMarkup xml; if (xml.Load("UserInfo.xml")) { CString strUserID = _T(""); xml.ResetMainPos(); if (xml.FindChildElem("SHIPMENT")) { xml.IntoElem(); if (xml.FindChildElem("POC")) { xml.IntoElem(); CString str_type=xml.GetAttrib("type"); MessageBox(str_type); xml.SetAttrib("type","change"); strUserID = xml.GetData(); if (xml.FindChildElem("TEL")) { xml.IntoElem(); xml.SetData("123456789"); xml.Save("UserInfo.xml"); return; } } } } (七)删除元素: 删除SN=132487A-J的项目。 CMarkup xml; if (xml.Load("UserInfo.xml")) { CString strUserID = _T(""); xml.ResetMainPos(); if (xml.FindChildElem("ITEM")) { xml.IntoElem(); CString str_sn; xml.FindChildElem("SN"); str_sn=xml.GetChildData(); if(str_sn=="132487A-J") { xml.RemoveElem(); xml.Save("UserInfo.xml"); } } } 立即下载

相关推荐

CMarkup(添加了缩进功能)

1:修改了原版库中的三个函数,来使得添加元素的时候自动加入缩进量 x_GetTagName x_AddElem x_InsertNew 2:缩进量采用的是2个空格符 3:以上说的修改只能在添加元素(不管是新建XML文档,还是打开已有文档进行添加)的时候加入缩进,如果已有文档本身是没有缩进的,那么Save保存的时候以前的部分还是一样不能格式化,这个时候可以选用SaveAndFormat函数,不过该函数递归实现,数据量大的时候会影响效率,慎用;

VC解析XML--使用CMarkup类解析XML

经过今天尝试MFC解析XML串,也算有了不少收获,总结一下。我是使用的CMarkup类对XML进行操作。CMarkup好象都是先从一个xml文件里面把内容读出来,再进行解析,搞得我恨不得要把我的CString写到xml文件里面再取出来了。如果需要直接读取CString,可以直接用 CMar...

weixin_30438813的博客 175

VC读取并解析XML文件.并以树型控件显示其内容.zip

VC读取并解析XML文件.并以树型控件显示其内容.zip

vc中操作Xml--使用CMarkup类

DotNet中使用xml相对比较轻松,在vc中操作xml,有些繁琐。CMarkup比较好用//----------UserInfo.xml--------------xml version="1.0" encoding="UTF-8" ?> UserInfo>  UserID>luoUserID>   UserID>linUserID>   UserInfo> 

liugy1126的专栏 2173

XML类(VC60下C++封装的通用XML类,并附使用说明)

前一段时间上传了C++XML封装类的示例程序是用VS2005做的,考虑到有些朋友常常使用经典的VC60,因此把实例又改编成VC60下的版本,由于我是做对日开发的,所以从VS2005考到VC60时注释变成乱码,最近比较忙,就不改了,你可以对照随之上传得使用说明阅读。(最后请注意VC6一定要打补丁,因为用了auto_ptr)不足请指正,谢谢!

(UE5 5.2)HISM Mobile DrawInstance在渲染层的实现浅分析

在 (UE4 4.27) UHierarchicalInstancedStaticMesh(HISM)原理分析 这篇博客大致介绍HISM组件从游戏线程到渲染线程的重建KD-Tree和剔除并提交DrawCall逻辑,但是没有分析渲染层的大致数据结构和实现. 可以看出FHierarchicalStaticMeshSceneProxy 实际存储Instance数组数据来自于FInstancedStaticMeshSceneProxy FHierarchicalStaticMeshSceneProxy只是以FClu

qq_29523119的博客 2725

(转)VC解析XML--使用CMarkup类解析XML

<br /> <br />VC解析XML--使用CMarkup类解析XML。<br />(一) 先讲一下XML中的物殊字符,手动填写时注意一下。<br />字符                   字符实体<br />&                       &或&#38;<br />'                       &apos;或'<br />>                       >或><br /><                   

Jessie的专栏 407

【UE5.3 Cesium for Unreal】GlobePawn编译实战:从源码修改到功能实现

本文详细介绍了在UE5.3中为Cesium for Unreal插件编译和集成非官方增强组件GlobePawn的完整实战流程。从获取源码、准备资产文件、部署项目结构,到逐行修改代码适配工程并解决典型编译错误,最终实现在三维地球上实现类似Google Earth的丝滑鼠标交互体验。

weixin_29011667的博客 307

vc中操作Xml--使用CMarkup类 - VC使用MSXML解析XML文档

VC使用MSXML解析XML文档 第一部分:DOM解析:       概述:DOM解析将会把一个完整的XML文档读进来,生成一个结构树。这样会要把XML文档全部都加载到内在中。所以解析起来的速度会要慢一些。     1、如何加载xml文件:          //创建DOM,加载XML文档          MSXML::IXMLDOMDocumentPtr

jasone123的专栏 712

arcgis导出自身相交数据

今天接到一个客户需求,一份面文件,里面有好多元素是两两相交甚至是三个相交的,现在要把这些重叠部分提取出来,并且把相交部分的原始要素的名称也保留在字段中,也就是说名称这个会有好多个名称字段,如果两个要素相交那就是前两个名称字段有值,后面的为空,如果是三个要素相交,那么输出的这个要素就是前三个名称字段有值,后面的为空,嗯,这里也不太确定会出现多少个名称字段,这个需要依照数据来定。 这是原始数据,...

miaowumi92的博客 6787

用deepseek对GPU服务器进行压力测试

利用 DeepSeek 模型对 GPU 服务器进行压力测试,核心思路是通过,验证 GPU 服务器在计算、显存、网络等维度的承载能力,同时观察稳定性与性能瓶颈。

weixin_42795092的博客 1609

VC轻松解析XML文件 - CMarkup类的使用方法

VC轻松解析XML文件 - CMarkup类的使用方法http://www.cctry.com/thread-3866-1-1.html VC解析XML文件的工具有很多,CMarkup, tinyXML,还有IBM的,MS的等等。据说tinyXML很好,可能字符集问题,我编译不了。所以就用CMarkup来解析,使用过后,觉得非常不错,使用起来很方便。CM...

weixin_34111790的博客 184

DFT与机器学习协同设计高效光催化剂:从电子结构到性能预测

密度泛函理论(DFT)作为计算材料学的基石,通过求解Kohn-Sham方程,能够在原子尺度精确预测材料的电子结构、能带和光学性质,为理解光催化等能源材料的微观机理提供了关键视角。其核心价值在于替代传统试错法,实现材料性能的理性设计与机理揭示。在工程实践中,面对高通量筛选的需求,机器学习(ML)技术,特别是长短期记忆网络(LSTM)这类擅长处理序列数据的模型,能够学习从材料描述符到复杂性能(如光谱)的映射关系,实现快速性能预测与优化。这种DFT与ML的结合范式,正广泛应用于新能源材料、半导体器件等领域,用于高

weixin_30662937的博客 661
上一篇: using namespace std
下一篇: MFC中CMainFrame类CDoc类CView类CApp类之间关系
flymachine
博客等级 码龄23年 253粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值