关于Poco解析XML的文章很多,我就不多叙述了,在这里贴上自己的一个小例子供大家参考。
假如我们有下边这样一个XML文件,那么用Poco解析我们就通过下边的方法进行
<?xml version="1.0" encoding="UTF-8"?>
<PersonS personCount="2">
< Person id="1">
<elem eName="name" value="Tom"/>
<elem eName="address" value="beijing" />
<elem eName="age" value="18"/>
</Person>
< Person id="2">
<elem eName="name" value="Jack"/>
<elem eName="address" value="shanghai" />
<elem eName="age" value="28"/>
</ Person >
</ PersonS >
我写了一个非常简单的类来进行数据获取
#include <Poco/DOM/DOMParser.h>
#include <Poco/DOM/Document.h>
#include <Poco/DOM/Node.h>
#include <Poco/DOM/NamedNodeMap.h>
#include <Poco/AutoPtr.h>
#include <Poco/XML/XMLString.h>
using Poco::AutoPtr;
using Poco::XML::DOMParser;
using Poco::XML::Document;
using Poco::XML::XMLString;
using Poco::XML::Node;
using Poco::XML::NamedNodeMap;
class XMLOperator{
public:
XMLOperator(const char* name):_fileName(name){
Initialize();
}
~XMLOperator(){
if(NULL != _parser){
delete _parser;
_parser = NULL;
}
}
XMLString getNodeValue(const char* strpath, const char* namedItem)
{
Node * pNode = NULL;
XMLString tempValue;
pNode = _pDoc->getNodeByPath(strpath);
if(pNode->hasAttributes())
{
NamedNodeMap* pmap = pNode->attributes();
Node * valueNode = pmap->getNamedItem(namedItem);
tempValue = valueNode->nodeValue();
pmap->release();//注意释放操作
}else
{
tempValue = "";
}
return tempValue;
}
private:
const char* _fileName;//要操作的XML文件的名字
DOMParser* _parser;
AutoPtr<Document> _pDoc;
private:
void Initialize(){
_parser = new DOMParser();
_pDoc = _parser->parse(_fileName);
}
};
然后就简单介绍一下这个类的使用,我们定义一个结构体,通过操作将XML中的数据放进一个结构体容器中
#include<vector>
//可以用string来接收name和address数据
struct Person
{
char name[10];
char address[20];
int age;
}
int main(){
//填上XML文件的路径
XMLOperator *xmlOperator = new XMLOperator("/path/xml");
std::vector<Person> vp;
//拿到个数
int pCount =
atoi((
xmlOperator->getNodeValue("PersonS","personCount")).c_str());
for(int i =1; i<=pCount; i++)
{
struct Person tempPerson;
std::ostringstream oss;
oss << "PersonS/Person[@id='" << i << "']/elem[@eName='name']";
XMLString namepath(oss.str());
strcpy(tempPerson.name,(xmlOperator->getNodeValue(namepath.c_str(),"value")).c_str());
//重置流中的内容
oss.str("");
oss << "PersonS/Person[@id='" << i << "']/elem[@eName='address']";
XMLString addpath(oss.str());
strcpy(tempPerson.address,(xmlOperator->getNodeValue(addpath.c_str(),"value")).c_str());
oss.str("");
oss << "PersonS/Person[@id='" << i << "']/elem[@eName='age']";
XMLString agepath(oss.str());
tempPerson.age = atoi(xmlOperator->getNodeValue(agepath.c_str(),"value")).c_str());
vp.push_back(tempPerson);
}
return 0;
}
这个小例子应该可以满足一些不很复杂的应用场合了