1. C++解析XML的开源库
在项目中XML的解析使用的是开源的第三方库,TinyXML;这个解析库的模型通过XML文件,然后再内存中生成DOM模型,从而让我们可以很方便的遍历这颗XML树。
DOM模型即文档对象模型,是将整个文档分成多个元素(如:书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。先看一下TinyXML中的主要类和XML文档之间的对应关系,下图是TinyXML中主要class的类图,反应各个类之间的静态关系。
TiXmlBase是所有类的基类,TiXmlNode、TiXmlAttribute两个类都继承自TiXMLBase类,其中TiXmlNode类指的是所有被<...>...<.../>包括的内容,而xml中的节点又具体分为以下几方面内容,分别是声明、注释、节点以及节点间的文本,因此在TiXmlNode基础上又衍生出来这几个类TiXmlComment、TiXmlDeclaration、TiXmlDocument、TiXmlElement、TiXmlText、TiXmlUnknown,分别用来指明具体是xml中的哪一部分。TiXmlAttribute类不同于TiXmlNode,它指的是在尖括号里面的内容,像<...***=...>,其中***就是一个属性,这里采用一个XML文档具体说明一下:
1. ?? 2.?? 3.???? ?? 4.???? ?- ?? 5.????????
?? 10.????miaomaio ?? 6.????Shaanxi?Xi'an ?? 7.????13759911917 ?? 8.????miaomiao@home.com ?? 9.????- ?? 11.????????
?? 16.???? ??gougou ?? 12.????Liaoning?Shenyang ?? 13.????15840330481 ?? 14.????gougou@home.com ?? 15.????
l 像TiXmlDeclaration指的就是 ,
l 像TiXmlComment指的就是 、 ,
l 像TiXmlDocument指的就是整个xml文档,
l 像TiXmlElement指的就是
l 像TiXmlText指的就是‘gougou’、‘15840330481’这些夹在
l 像TiXmlAttribute指的就是 节点中version、encoding,
l 除此之外就是TiXmlUnknown。
1) 读取XML文件
//!xml文件读取,模拟调用接口返回char *字符串
filebuf *pbuf;
ifstream filestr;
long size;
char *buffer;
filestr.open(XML_EXAMPLE_FILE_NAME, ios::binary);
pbuf = filestr.rdbuf();
size = pbuf->pubseekoff(0,ios::end,ios::in);
pbuf->pubseekpos(0, ios::in);
buffer = new char[size];
pbuf->sgetn(buffer, size);
filestr.close();
//!从xml字符串中获取相关值
string strCreationTime;
string strJobId;
string strJobType;
string strJobName;
string strJobLeader;
TiXmlDocument *xmlDocument = new TiXmlDocument();
xmlDocument->Parse(buffer, 0, TIXML_DEFAULT_ENCODING);
TiXmlElement *RootElement = xmlDocument->RootElement();
TiXmlElement *fileHeaderElement = RootElement->FirstChildElement();
TiXmlElement *fileBodyElement = fileHeaderElement->NextSiblingElement();
for (TiXmlElement *nodeElement = fileHeaderElement->FirstChildElement(); nodeElement; nodeElement = nodeElement->NextSiblingElement())
{
string strElementKey = nodeElement->Value();
if (strElementKey.compare(XML_PARSE_CREATION_TIME) == 0)
{
strCreationTime = nodeElement->GetText();
}
}
for (TiXmlElement *nodeElement = fileBodyElement->FirstChildElement(); nodeElement; nodeElement = nodeElement->NextSiblingElement())
{
string strElementKey = nodeElement->Value();
if (strElementKey.compare(XML_PARSE_JOB_ID) == 0)
{
strJobId = nodeElement->GetText();
}
if (strElementKey.compare(XML_PARSE_JOB_TYPE) == 0)
{
strJobType = nodeElement->GetText();
}
if (strElementKey.compare(XML_PARSE_JOB_NAME) == 0)
{
strJobName = nodeElement->GetText();
}
if (strElementKey.compare(XML_PARSE_JOB_LEADER) == 0)
{
strJobLeader = nodeElement->GetText();
}
}
2) 创建、生成XML文件
以如下XML文件为例:
ProxyMiddleWareJobSearch WetLand Platform 2014-9-18 10:25:20 ... 13
//! 构建XML字符串
TiXmlDocument *pDoc = new TiXmlDocument;
TiXmlDeclaration *pDeclaration = new TiXmlDeclaration("1.0", "gb2312", "");
pDoc->LinkEndChild(pDeclaration);
TiXmlElement *pEleRoot = new TiXmlElement("InterFaceFile");
pDoc->Lin