在C++中使用结构进行 XML 分析

XML Parsing using Structures in C++

本文关键字:XML 分析 结构 C++      更新时间:2023-10-16

我试图通过结构实现在C++中使用tinyxml API解析xml文件,但我下面的代码没有产生我预期的结果。下面是我的代码。

#include<iostream>
#include<list>
#include<string>
#include"tinyxml.h"
using namespace std;
struct accsys
{
    string name;
    string type;
    float rate;
};
void parser(struct accsys acc)
{   
    list<accsys> l;
    TiXmlDocument* doc= new TiXmlDocument();
    doc->LoadFile("accountsys.xml");
    TiXmlElement* root=doc->RootElement(); 
    TiXmlElement* accountElement=root->FirstChildElement(); 
    while(accountElement)
    {
        TiXmlElement* nameElement=accountElement->FirstChildElement(); 
        acc.name=nameElement->GetText();
        TiXmlElement* typeElement=nameElement->NextSiblingElement(); 
        acc.type=typeElement->GetText();
        TiXmlElement* rateElement=typeElement->NextSiblingElement(); 
            acc.rate=atof(rateElement->GetText());
        l.push_back(acc);
        accountElement=accountElement->NextSiblingElement();
    }
}
void display(struct accsys acc)
{   
    list<accsys> l;
    list<accsys>::iterator i;
    i=l.begin();
    while(i!=l.end())
    {
        cout<<"name:"<<i->name<<endl;
        cout<<"type:"<<i->type<<endl;
        cout<<"rate:"<<i->rate<<endl;
        i++;
    }
}

int main()
{
    struct accsys acc;
    parser(acc);
    display(acc);
    return 0;
}

请问任何一个都可以回答!

首先,传递对 std::list 的引用,而不是空结构,它不会比你创建的函数中的生存时间更长。您也不能在一个函数中列出列表并期望它在另一个函数中存在。

修复了格式,删除了这个丑陋的using namespace std;,并更正了您的代码。我想这就是你想要的。

#include <iostream>
#include <list>
#include <string>
#include "tinyxml.h"

struct accsys
{
    std::string name;
    std::string type;
    float rate;
};
void parser(std::list<accsys> &acc)
{
    TiXmlDocument *doc = new TiXmlDocument();
    doc->LoadFile("accountsys.xml");
    TiXmlElement *root = doc->RootElement(); 
    TiXmlElement *accountElement = root->FirstChildElement(); 
    while (accountElement)
    {
        struct accsys structAcc;
        TiXmlElement *nameElement = accountElement->FirstChildElement(); 
        structAcc.name = nameElement->GetText();
        TiXmlElement *typeElement = nameElement->NextSiblingElement(); 
        structAcc.type = typeElement->GetText();
        TiXmlElement *rateElement = typeElement->NextSiblingElement(); 
        structAcc.rate = atof(rateElement->GetText());
        acc.push_back(structAcc);
        accountElement = accountElement->NextSiblingElement();
    }
}
void display(std::list<accsys> &acc)
{   
    for (std::list<accsys>::iterator itr = acc.begin(); itr != acc.end(); ++itr)
    {
        std::cout << "name: " << itr->name << std::endl;
        std::cout << "type: " << itr->type << std::endl;
        std::cout << "rate: " << itr->rate << std::endl;
    }
}

int main()
{
    std::list<accsys> acc;
    parser(acc);
    display(acc);
    return 0;
}

我可以在您的代码中看到至少 3 个大错误:

1)正如marcinj所指出的那样,你正在将结构体accsys的副本传递给你的parser()函数,无论你在该结构中填写什么,你都不会在函数之外找到它。

2)同样在解析器中,您声明了一个函数本地的accsys结构列表,无论您在列表中放入什么,您都不会在函数之外看到它,而且在while循环中,您不断覆盖acc结构中的值,因此即使在最好的情况下,您也只会看到xml文件的最后一行。

3)在显示函数中,您将accsys结构传递给函数,然后忘记了它,并尝试打印刚刚创建的结构列表的内容,该列表显然是空的。

因此,假设 xml 解析器是正确的,您的代码必须或多或少如下所示:

#include<iostream>
#include<list>
#include<string>
#include"tinyxml.h"
using namespace std;
struct accsys
{
    string name;
    string type;
    float rate;
};
void parser(list<struct accsys *> &accList)
{   
    TiXmlDocument* doc= new TiXmlDocument();
    doc->LoadFile("accountsys.xml");
    TiXmlElement* root=doc->RootElement(); 
    TiXmlElement* accountElement=root->FirstChildElement(); 
    while(accountElement)
    {
        struct accsys *acc = new struct accsys;
        TiXmlElement* nameElement=accountElement->FirstChildElement(); 
        acc->name=nameElement->GetText();
        TiXmlElement* typeElement=nameElement->NextSiblingElement(); 
        acc->type=typeElement->GetText();
        TiXmlElement* rateElement=typeElement->NextSiblingElement(); 
            acc->rate=atof(rateElement->GetText());
        l.push_back(acc);
        accountElement=accountElement->NextSiblingElement();
    }
}
void display(list<struct accsys *> &l)
{   
    list<struct accsys *>::iterator i;
    i=l.begin();
    while(i!=l.end())
    {
        cout<<"name:"<<i->name<<endl;
        cout<<"type:"<<i->type<<endl;
        cout<<"rate:"<<i->rate<<endl;
        i++;
    }
}

int main()
{
    list <struct accsys *> acc;
    parser(acc);
    display(acc);
    return 0;
}