1. C++解析XML的开源库在项目中XML的解析使用的是开源的第三方库,TinyXML;这个解析库的模型通过XML文件,然后再内存中生成DOM模型,从而让我们可以很方便的遍历这颗XML树。DOM模型即文档对象模型,是将整个文档分成多个元素(如:书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。先看一下TinyXML中的主要类和XML文档之间的对应关系,下图是TinyXML中主要class的类图,反应各个类之间的静态关系。《
C++ 设计新思维》 下载见 http://www.linuxidc.com/Linux/2014-07/104850.htm
C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码 http://www.linuxidc.com/Linux/2014-05/101227.htm读C++ Primer 之构造函数陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm读C++ Primer 之智能指针 http://www.linuxidc.com/Linux/2011-08/40177.htm读C++ Primer 之句柄类 http://www.linuxidc.com/Linux/2011-08/40175.htm
将C语言梳理一下,分布在以下10个章节中:- Linux-C成长之路(一):Linux下C编程概要 http://www.linuxidc.com/Linux/2014-05/101242.htm
- Linux-C成长之路(二):基本数据类型 http://www.linuxidc.com/Linux/2014-05/101242p2.htm
- Linux-C成长之路(三):基本IO函数操作 http://www.linuxidc.com/Linux/2014-05/101242p3.htm
- Linux-C成长之路(四):运算符 http://www.linuxidc.com/Linux/2014-05/101242p4.htm
- Linux-C成长之路(五):控制流 http://www.linuxidc.com/Linux/2014-05/101242p5.htm
- Linux-C成长之路(六):函数要义 http://www.linuxidc.com/Linux/2014-05/101242p6.htm
- Linux-C成长之路(七):数组与指针 http://www.linuxidc.com/Linux/2014-05/101242p7.htm
- Linux-C成长之路(八):存储类,动态内存 http://www.linuxidc.com/Linux/2014-05/101242p8.htm
- Linux-C成长之路(九):复合数据类型 http://www.linuxidc.com/Linux/2014-05/101242p9.htm
- Linux-C成长之路(十):其他高级议题
TiXmlBase是所有类的基类,TiXmlNode、TiXmlAttribute两个类都继承自TiXMLBase类,其中TiXmlNode类指的是所有被<...>...<.../>包括的内容,而xml中的节点又具体分为以下几方面内容,分别是声明、注释、节点以及节点间的文本,因此在TiXmlNode基础上又衍生出来这几个类TiXmlComment、TiXmlDeclaration、TiXmlDocument、TiXmlElement、TiXmlText、TiXmlUnknown,分别用来指明具体是xml中的哪一部分。TiXmlAttribute类不同于TiXmlNode,它指的是在尖括号里面的内容,像<...***=...>,其中***就是一个属性,这里采用一个XML文档具体说明一下:1.<?xml version="1.0" encoding="UTF-8"?>
2.<phonebook>
3. <!--one item behalfs one contacted person.-->
4. <item>
5. <name>miaomaio</name>
6. <addr>Shaanxi Xi"an</addr>
7. <tel>13759911917</tel>
8. <email>miaomiao@home.com</email>
9. </item>
10. <item>
11. <name>gougou</name>
12. <addr>Liaoning Shenyang</addr>
13. <tel>15840330481</tel>
14. <email>gougou@home.com</email>
15. </item>
16. <!--more contacted persons.-->
16. </phonebook>
- 像TiXmlDeclaration指的就是,
- 像TiXmlComment指的就是、,
- 像TiXmlDocument指的就是整个xml文档,
- 像TiXmlElement指的就是
- 、、、等等这些节点,
- 像TiXmlText指的就是‘gougou’、‘15840330481’这些夹在与、与、与之间的文本文字,
- 像TiXmlAttribute指的就是节点中version、encoding,
- 除此之外就是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文件为例:<?xml version=”1.0” encoding=”gb2312”>
<InterFaceFile>
<FileHeader>
<MessageType>ProxyMiddleWareJobSearch</MessageType>
<Originator>WetLand</Originator>
<Recipient>Platform</Recipient>
<CreationTime>2014-9-18 10:25:20</CreationTime>
</FileHeader>
<FileBody>
<UserName>...</UserName>
<UserRoleID>13</UserRoleID>
<JobType></JobType>
</FileBody>
</InterFaceFile> //! 构建XML字符串
TiXmlDocument *pDoc = new TiXmlDocument;
TiXmlDeclaration *pDeclaration = new TiXmlDeclaration("1.0", "gb2312", "");
pDoc->LinkEndChild(pDeclaration); TiXmlElement *pEleRoot = new TiXmlElement("InterFaceFile");
pDoc->LinkEndChild(pEleRoot); TiXmlElement *pEleFileHeader = new TiXmlElement("FileHeader");
TiXmlElement *pEleFileBody = new TiXmlElement("FileBody");
pEleRoot->LinkEndChild(pEleFileHeader);
pEleRoot->LinkEndChild(pEleFileBody); TiXmlElement *pEleMessageType = new TiXmlElement("MessageType");
TiXmlElement *pEleOriginator = new TiXmlElement("Originator");
TiXmlElement *pEleRecipient = new TiXmlElement("Recipient");
TiXmlElement *pEleCreationTime = new TiXmlElement("CreationTime");
pEleFileHeader->LinkEndChild(pEleMessageType);
pEleFileHeader->LinkEndChild(pEleOriginator);
pEleFileHeader->LinkEndChild(pEleRecipient);
pEleFileHeader->LinkEndChild(pEleCreationTime); TiXmlText *pEleMessageTypeText = new TiXmlText("ProxyMiddleWareJobSearch");
TiXmlText *pEleOriginatorText = new TiXmlText("WetLand");
TiXmlText *pEleRecipientText = new TiXmlText("Platform");
TiXmlText *pEleCreationTimeText = new TiXmlText("2014-9-18 10:25:20"); pEleMessageType->LinkEndChild(pEleMessageTypeText);
pEleOriginator->LinkEndChild(pEleOriginatorText);
pEleRecipient->LinkEndChild(pEleRecipientText);
pEleCreationTime->LinkEndChild(pEleCreationTimeText); //!
TiXmlElement *pEleUserName = new TiXmlElement("UserName");
TiXmlElement *pEleUserRoleID = new TiXmlElement("UserRoleID");
TiXmlElement *pEleJobType = new TiXmlElement("JobType");
pEleFileBody->LinkEndChild(pEleUserName);
pEleFileBody->LinkEndChild(pEleUserRoleID);
pEleFileBody->LinkEndChild(pEleJobType); TiXmlText *pEleUserNameText = new TiXmlText("...");
TiXmlText *pEleUserRoleIDText = new TiXmlText("13");
TiXmlText *pEleJobTypeText = new TiXmlText(""); pEleUserName->LinkEndChild(pEleUserNameText);
pEleUserRoleID->LinkEndChild(pEleUserRoleIDText);
pEleJobType->LinkEndChild(pEleJobTypeText); pDoc->SaveFile("E:/houqd.xml");3) 生成XML字符串
生成XML字符串只需要将如上的pDoc->SaveFile(“E:/houqd.xml”)替换为如下://!生成string字符串
TiXmlPrinter printer;
pDoc->Accept(&printer); string strRequest(printer.CStr());
更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2015-02/112880p2.htm