POCO::XML(一) 简单写XML文档

时间:2022-07-21 12:04:32

在项目中需要用到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的头文件还没有包含呢.所以需要再包含这两个头文件。


谢谢观赏!