上图是一段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<len;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<Row;j++)
{
xml.AddChildElem(_T(“BinCode”));
strTemp=_T(“”);
for(int i=0;i<strResult.GetSize();i++)
{
strTemp+=strResult.GetAt(i);
xml.SetChildData(strTemp);
}
}
bool ret=xml.Save(xxx.xml);
写完之后记得保存数据到文件就可以了
这样我们xml的读写就基本完成了,你学会了?
格式—>Load—>findElem–GetAttrib.