在项目中需要用到POCO这个C++库,它的资源太少了,很多是英文,幸亏英文文档不是太难,语法还算能让人保持兴趣。
POCO库中有很多模块,今天和大家聊聊XML这个子模块。XML在项目中经常被用到,它简单的格式,高效的性能是网络
传输信息的极佳载体,它时常被围绕在读和写这两个方面,让我们先开始写吧。
先介绍一下XML文档中有哪些元素:
Element-文档中耨个节点
Attr-文档中某个节点的属性
Text-文档中某个节点的文本
Comment-注释
ProcessingInstruction-处理信息
对于我们程序员设计网络包来说,前三个够用,起码对我目前来说。既然要用这些属性,那么我们就需要在我们的程序中
包含这些头文件:
#include "Poco/DOM/Text.h" #include "Poco/DOM/Element.h" #include "Poco/DOM/Comment.h" #include "Poco/DOM/ProcessingInstruction.h" #include "Poco/DOM/Attr.h"除此之外,POCO对文档的抽象类Document也要包含:
#include "Poco/DOM/Document.h"感觉必要的头文件包含之后,我们就可以动手写一个小程序了:
AutoPtr<Poco::XML::Document> pDoc = new Poco::XML::Document; AutoPtr<Poco::XML::Element> myRoot = pDoc->createElement("Root"); AutoPtr<Poco::XML::Element> myChild = pDoc->createElement("Child"); AutoPtr<Poco::XML::Element> myGrandChild = pDoc->createElement("GrandChild"); AutoPtr<Poco::XML::Text> nameNode = pDoc->createTextNode("my_name_is_xiaoqiang"); AutoPtr<Poco::XML::ProcessingInstruction> pi = pDoc->createProcessingInstruction("xml","version='1.0' encoding='UTF-8'" ); AutoPtr<Poco::XML::Comment> comm = pDoc->createComment("new_day");为甚么Document前面会有Poco::XML::这个东西?此东西为命名空间,POCO库中有很多命名空间,分门别类,很是醒目,
所以你需要如此做。或者,你可以像:
using namespace std;
一样在函数前面写上:
using Poco::XML::Document;其他的类似。而AutoPtr是个智能指针类,它负责在指明的对象不用时帮你析构了,这个在POCO库中经常用到,要非常小心。
上面这些代码的作用是创建是元素,下面让我们来把他们组合成一个文档:
myGrandChild->appendChild(nameNode); myChild->appendChild(myGrandChild); myRoot->appendChild(myChild); pDoc->appendChild(pi); pDoc->appendChild(comm); pDoc->appendChild(myRoot);组合成文档之后,我们需要将这个文档直接写入目标文件:
DOMWriter write; write.setOptions(XMLWriter::PRETTY_PRINT); FileStream ofs("./example.txt",std::ios::in); write.writeNode(ofs,pDoc);第一句代码是创建一个写的人,他负责将文档写入文件。
第二句代码是每一个元素都在文件中另起一行,易于读者观看。
第三句代码创建一个POCO的文件流,指定目标文件和动作。
第四句代码,将数据通过流写入到文件中。
编译过程中会出错,因为DOMWriter,FileStream的头文件还没有包含呢.所以需要再包含这两个头文件。
谢谢观赏!