在C++中使用结构进行 XML 分析
XML Parsing using Structures in C++
我试图通过结构实现在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;
}
相关文章:
- (C++)分析树以计算返回错误值的简单算术表达式
- Cppcheck生成xml转储文件
- 函数复杂度分析
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 使用指针重新分析实体
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 如何在pugixml中获取节点的内部XML
- 如何使用tinyxml2从XML加载父实体和子实体
- boost xml parsingl将xml的路径作为变量发送
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 使用 Tinyxml 在 xml 中添加一个子子项
- 分析包含处理指令的 XML
- 正在分析XML样式表处理指令
- 使用C++堆栈/队列分析XML文件
- 正在分析XML中C/C++头文件中定义的嵌套结构/联合
- 如何使用C++创建工具来分析 XML 文件
- 在C++中使用结构进行 XML 分析
- 正在分析C++中的无效XML
- 通过流分析不完整的 XML 消息的最有效方法是什么?
- 可生成xml输出的unix c++代码复杂度分析