使用RapidXML和c++从XML文件构建树
Building a Tree from XML File using RapidXML and c++
对于我的c++类的一个项目,我应该解析一个xml文件并从中构建二叉树。该文件比这要密集得多,但布局如下:
<?xml version="1.0" encoding="utf-8"?>
<MyJournal>
<species>
<name>Sea Creature</name>
<species>
<name>Fish</name>
<species>
<name>swordfish</name>
</species>
<species>
<name>grouper</name>
</species>
</species>
<species>
<name>Mammal</name>
<species>
<name>dolphin</name>
</species>
<species>
<name>whale</name>
</species>
</species>
</species>
<species>
<name>Land animal</name>
<species>
<name>Mammal</name>
<species>
<name>dog</name>
</species>
<species>
<name>cat</name>
</species>
</species>
<species>
<name>Bird</name>
<species>
<name>blue jay</name>
</species>
<species>
<name>robin</name>
</species>
</species>
</species>
</MyJournal>
我很难弄清楚如何解析这些数据,以便我可以构建一个树。我想我可以对每个分支使用递归但是我只能得到一个子节点。有人暗示使用队列将数据放入树结构中,但我不太确定如何使用队列遍历树的所有级别。我觉得递归是解析每个分支的数据的最简单的方法,但是我不知道如何正确地实现递归方法。这是我尝试使用的方法。我先传入根节点:
void loop(xml_node<> *species)
{
Node t1 = *new Node();
xml_node<> * name_node = species->first_node("name");
if(name_node != 0)
{
t1.setName(name_node->value());
cout << name_node->value() << endl;
}
xml_node<> * child = species->first_node("species");
if(child != 0)
{
cout << child->first_node("name")->value() << endl;
if(child->first_node()->next_sibling() != 0)
{
loop(child->first_node()->next_sibling());
xml_node<> * child2 = child->next_sibling();
cout << child2->first_node()->value() << endl;
loop(child2->first_node()->next_sibling());
}
}
}
它只遍历返回Sea Creature的每个节点的第一个子节点鱼剑鱼陆地动物哺乳动物狗
我将非常感谢任何正确方向的指示。谢谢!
要覆盖此文件中的所有节点,需要查看每个节点的子节点及其兄弟节点。你似乎明白这一点。
您的递归方法是获取子节点的可行选择。它似乎起作用了。对loop
的每一次递归调用都深入到子进程的更深一层。(告诉你使用"queue"的人可能指的是"stack"……递归隐式地使用堆栈。调用栈
我们想念的是兄弟姐妹。由于递归被用于深入XML树,所以这可能无法通过更多的递归来解决。
看看你代码中的这部分代码:
xml_node<> * child = species->first_node("species");
if(child != 0)
{
cout << child->first_node("name")->value() << endl;
这是您找到第一个兄弟姐妹的地方,例如"swordfish"
。
尝试将if
语句更改为循环,因此所包含的逻辑将对所有兄弟姐妹执行,而不仅仅是第一个。
我知道这个问题已经有了答案,但我只是想给一个有用的提示。
不用递归,你可以使用堆栈/队列来解析这个XML文件来构建你的"树"结构。
如果你想坚持递归,确保所有的子节点都指向同一个父节点,否则树结构将是错误的。
相关文章:
- 如何从构建 libgpio.so 的生成文件构建libgpio.a
- 为多个测试文件构建可执行文件
- 在QMAKE中编译之前,如何使用可执行文件构建多个标头文件
- 从同一文件构建基类和继承类
- cmake:如何迭代目录中的所有源文件并将每个文件构建到可执行文件中
- MEX文件构建具有八度的构建(包装纸问题)
- 通过解析文件构建逻辑语句
- C++ 如何从.dat文件构建字符串的 2D 矩阵?5 列 x 行
- 使用其他文件构建 gcc 插件
- 从文件构建有向图
- 仅使用 DLL *.h 头文件构建(compile.link)应用程序代码,并在运行时加载 DLL 实现(显式链接)
- 使用两个文本文件构建链表
- 从PSD文件构建层comps
- 如何从多个c++文件构建二进制文件
- Eclipse:没有什么要为文件构建的
- MATLAB mex文件构建成功,但没有显示任何内容
- Android OS框架-将单个可执行文件构建为共享对象
- 当尝试从使用makefile生成的目标文件构建时,c++链接器错误.在我刚建立的时候不会发生
- 为什么Xcode 4.2为.cpp文件应用C文件构建规则脚本?
- Matlab Mex文件构建:代码更改不再影响mex文件