使用CMarkup类怎么创建大数据量的XML文件

2025-04-02 11:12:49
推荐回答(1个)
回答1:

创建新XML文档析修改现存XML文档所些都利用MFC或STL字符串所实现简单类关于CMarkup运行Zip文件右边例愿意通看源码几钟加入自应用
特征
Cmarkup依据EDOM简单XML析关键EDOM操作XML元素、属性数据简明集需要复杂XML特性避免读量DOMSAX文档
希望使用微软MSXMLCMarkup工程CmarkupMSXML类全面演示通EDOM使用MSXML并且C++ COM语始
载包(看面zip文件链接)包含测试框工程源码、Cmarkup类所测试示例、及编译选项关于用商业用途详细说明请看文章底部Licensing注意事项
面列CMarkup特征:
独立:需要任何外部XML组件
:编译工程类并且于文档维持字符串及总计于字符串内存索引数组
快:析器相快建立索引数组
简单:EDOM使创建、导航修改XML比简单
MSXML:CMarkupMSXML类用EDOM包装微软XML服务MSXML编译选项用演示类
UNICODE(统字符编码标准):于WindowsNTWindowsCE平台能够编译UNICODEWindowsNT UNICODEXML文档流UTF-8文件内部用宽字符
UTF-8:于UTF-8文件接受返UTF-8字符串(确保_MBCS没定义)
MBCS:于双字节数据(定义_MBCS)与UTF-8兼容.
STL:CMarkupSTL类完全没使用MFC演示要使用STL编译选项

每数据XML
我经文件需要保存或传递信息或计算机A 发送信息块计算机B总问题现:我要安排些数据格式现XML前能要考虑env类型例PATH=C:"WIN95; ini类型(些部组合)逗号限制或其些限制、或者固定字符串度现XML确定些问题答案某些候程序员气馁需要些便于帮助析格式尖括号所些解决XML复杂性于低限度读XML标签匹配规则我建议阅读CcodeProject站点Beginning XML - Chapter 2: Well-Formed XML
XML 更灵自等级加广泛应用虽XML比限定格式用更字符需要良向压缩需要扩展文档信息类型XML灵性体现需要要求信息每消费者重写逻辑程能够保持旧信息标识并且制定用相同式增加新属性元素

使用CMarkup
Cmarkup 基于压缩文档象模型(EDOM : "Encapsulated" Document Object Model,)简单XML处理器关键套XML处理产效与DOM(Document Object Model)整DOM数象类型EDOM定义象:XML文档EDOMXML原始吸引力—简单关于完整文档请看EDOM Specification.
CmarkUp 封装XML文档文本、结构前位置提供增加元素、导航元素属性数据所文档操作执行取决于前位置前孩位置前位置允许增加元素文档位置需要明确指增加象文档点CMarkup效命周期象直保持着用描述文档字符串调用GetDoc.
查看free firstobject XML editor源码用CMarkup创建、导航自XML文档
创建XML文档
于创建XML文档需要实例化CMarkup象并调用AddElem创建根元素.位置调用AddElem("ORDER") 文档简单装空ORDER元素. 调用AddChildElem 根元素面创建元素 (例:进入根元素内部层表示).面示例代码创建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" );
CString csXML = xml.GetDoc();

些代码产面XML根结点ORDER元素;注意始标签 结束标签结尾元素父面(深入或包含)父元素始标签要前结束标签要ORDER元素包含ITEM元素ITEM元素包含三字元素:SN、NAMEQTY;

132487A-J
crank casing
1

例所显示能够元素创建新元素需要调用IntoElem 移前主位置前元素位置面增加元素CMarkup索引保持前位置指针保证源码更加短更简单导航文件相同逻辑位置使用
导航XML文档
面例所创建XML字符串用SetDoc加入CMarkup象能够解析引导确进入创建同CMarkup象要设置前位置文档始需要调用ResetPos.
面例csXML字符串CMarkup象我循环ORDER元素所ITEM元素并每项目序号数量
CMarkup xml;
xml.SetDoc( csXML );
while ( xml.FindChildElem("ITEM") )
{
xml.IntoElem();
xml.FindChildElem( "SN" );
CString csSN = xml.GetChildData();
xml.FindChildElem( "QTY" );
int nQty = atoi( xml.GetChildData() );
xml.OutOfElem();
}

于我发现每元素查询元素前要调用IntoElem查询完再调用OutOfElem 习惯于种导航类型知道检查循环要确定每IntoElem 调用都与应OutOfElem 调用
增加元素属性
面创建文档例仅创建ITEM元素现例创建项目前内容加裁再增加数据源加SHIPMENT信息元素属性段代码演示能调用调用IntoElemAddElem代替AddChildElem,函数调用虽意味着更调用许认更直观
CMarkup xml;
xml.AddElem( "ORDER" );
xml.IntoElem(); // inside ORDER
for ( int nItem=0; nItem{
xml.AddElem( "ITEM" );
xml.IntoElem(); // inside ITEM
xml.AddElem( "SN", aItems[nItem].csSN );
xml.AddElem( "NAME", aItems[nItem].csName );
xml.AddElem( "QTY", aItems[nItem].nQty );
xml.OutOfElem(); // back out to ITEM level
}
xml.AddElem( "SHIPMENT" );
xml.IntoElem(); // inside SHIPMENT
xml.AddElem( "POC" );
xml.SetAttrib( "type", csPOCType );
xml.IntoElem(); // inside POC
xml.AddElem( "NAME", csPOCName );
xml.AddElem( "TEL", csPOCTel );

段代码产面XML根元素ORDER包含两ITEM元素SHIPMENT元素ITEM元素全都包含SN、NAME、QTY元素SHIPMENT元素包含带属性类型POC元素NAME及TEL元素

132487A-J
crank casing
1

4238764-A
bearing
15

John Smith
555-1234

查找元素
FindElem FindChildElem用于兄弟元素选标签名指定与标签名相匹配元素发现元素前元素并且调用Find前位置兄弟或匹配兄弟
判断元素索引调用两Find间定要复位前位置看面例ITEM元素别创建XML文件能确定SN元素QTY元素前查找QTY元素前要调用ResetChildPos();
于用特定序号查找元素需要完全循环ITEM元素并比较SN元素数据搜索序号例同于先前导航例调用IntoElem 进入ORDER元素并且用FindElem("ITEM")替换FindChildElem("ITEM");其实两种式都挺需要注意Find指定ITEM元素标签名我忽略所其兄弟元素例SHIPMENT元素
CMarkup xml;
xml.SetDoc( csXML );
xml.FindElem(); // ORDER element is root
xml.IntoElem(); // inside ORDER
while ( xml.FindElem("ITEM") )
{
xml.FindChildElem( "SN" );
if ( xml.GetChildData() == csFindSN )
break; // found
}

编码
ASCII编码引用我所依靠字符码128字符用英语编程使用ASCII码便UTF-8编程与拉公共ASCII集相同
所使用字符集Unicode编码集(UTF-8UTF-16UCS-2)于交互性及IE显示真需要XML声明进行描述像ISO-8859-1(西欧)字符集指定字符值比特且128255间便每字符仍使用比特Windows双字节字符集像GB2312Shift_JISEUC-KR每字符都用或两字节于些Windows字符集预处理需要定义 _MBCS 并要确定用户操作系统设置合适编码页
关于用XML描述XML文档前缀像需要通用SetDoc或Cmarkup构造函数传递结尾要包括车符根结点显示行
xml.SetDoc( ""r"n" );
xml.AddElem( "island", "Cura?ao" );