xml是大家普遍使用的一种通用化的格式文件,那么这种格式到底有什么奥秘,今天我们就一起看看吧.
上图是一段xml用浏览器打开的显示格式,每一个箭头对应一个属性内容,当然,属性内容还可以多次嵌套,展开的一部分如上图所示.
以尖括号+ 名称 例如: 开始
以尖括号+/+名称,结束结束
第一行一般写xml的版本,编码格式,
以便后续或他人解析使用,编码格式不正确解析出来会出现各种问题,多空格或乱码等等.
第二行就是我们需要的数据名称,
属性例如:名称LotID,属性lotID,row,column =后面的就是该属性(名称)的值.
搞清楚这个,那么我们在写入,读取数据的时候就非常的方便,根据格式就可以轻松读写.
CMarkup xml;
xml.Load(xxxx)第一个函数xml的加载,load,读取xml文件,一般是X:\\xx\xx.xml(.XML)区分大小写后缀.
加载成功之后,我们就可以读取数据内容.
xml.IntoElem();加载之后,我们使用IntoItem()函数,进入下一次根目录,接着查找我们的属性名称,例如
BOOL bstr =xml.FindElem(_T("LotID"));
按照顺序,依次获取对应的属性,属性值.
xml.GetAttrib(XXX);获取对应属性的属性值.
if (bstr )
{
xml.IntoElem();
str= xml.FindElem(_T("MapData"));
xml.IntoElem();
str= xml.FindElem(_T("SubstrateMaps"));
xml.IntoElem();
}
当有多个重复属性名称时,我们可以使用循环去查找,例如我们想获取BinCode的值,就需要先找到overlay-->BinCodeMap--->BinCode,具体实现代码:
每一个IntoElem对应一个OutElem,而且必须是一一对应关系.
while (xml.FindElem(_T("SubstrateMap")))
{
SubStrateId=xml.GetAttrib(_T("SubstrateId"));
SubStrateType=xml.GetAttrib(_T("SubstrateType"));
xml.IntoElem();
int mappingIndex=0;
int oldmappingIndex=0;
while(xml.FindElem(_T("Overlay")))
{
mapName=xml.GetAttrib(_T("MapName"));
xml.IntoElem();
BOOL binMap=xml.FindElem(_T("BinCodeMap"));
{
CString strMap,strMapAll;
while(xml.FindChildElem(_T("BinCode")))
{
strMap=xml.GetChildData();
strMap.Remove(_T(''));
CString strErrorCode,strErrorCodeTemp;
int len=strMap.GetLength();
for(int i=0;i { TCHAR s = strMap.GetAt(i); } }xml.OutOfElem(); }xml.OutOfElem(); xml.OutOfElem(); xml.OutOfElem(); 以上代码总共出现5个因此,结束时候也应该是5个OutOfElem(); 读数据先查找FindElem,FindChildElem,根据名称我们就可以很好区分是子元素还是根目录元素,像这种BinCode就属于子元素,多次重复出现在多行的一般是子元素childElem,分开的 中间有间隔的多次出现的如SubstrateMap,SubstrateId这样的通常认为是Elem. 写的的时候就更简单,获取的数据,写到对应的属性值中就可以, xml.AddElem()属性元素名称 xml.SetAttrib()属性名称 xml.SetElemContent();属性内容 子元素采用循环的方式写入对应的数据内容:BinCode的写入方法简例如下 CString strTemp; for (int j=0;j { xml.AddChildElem(_T(“BinCode”)); strTemp=_T(“”); for(int i=0;i { strTemp+=strResult.GetAt(i); xml.SetChildData(strTemp); } } bool ret=xml.Save(xxx.xml); 写完之后记得保存数据到文件就可以了 这样我们xml的读写就基本完成了,你学会了? 格式—>Load—>findElem–GetAttrib.