Poco解析XML小例子

关于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;
}

这个小例子应该可以满足一些不很复杂的应用场合了

猜你喜欢

转载自blog.csdn.net/veghlreywg/article/details/72824496
今日推荐