解析XML inOrder C++

问题描述:

这与我之前的一个问题有关。我试图从xml文件构建一棵树。我打算通过xml文件并从数据中创建对象,并以前序和前序创建对象的向量,以便构建树对象。我使用的XML文件比这更密(约23平左右),但这里是布局的一个例子:解析XML inOrder C++

<?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> 

我的前序后序和方法。首先传入根节点“MyJournal”。

void preOrder(xml_node<> *species) // add to left node 
{ 
    Node t1 = *new Node(); 
    xml_node<> * name_node = species->first_node("name"); 
    //If there is a value for name, set the name of the node to this name 
    if(name_node != 0) 
    { 
     t1.setName(name_node->value()); 
     cout << t1.getName() << " "; 
    } 
    //If there is no name node, print the default name which is "ROOT" 
    if(name_node == 0) 
    { 
     cout << t1.getName() << " "; 
    } 
    for (xml_node<> * child_node = species->first_node("species"); child_node; child_node = child_node->next_sibling()) 
    { 
     loop2(child_node); // add these to right node 
    } 
} 

void postOrder(xml_node<> *species) // add to left node 
{ 
    Node t1 = *new Node(); 
    for (xml_node<> * child_node = species->first_node("species"); child_node; child_node = child_node->next_sibling()) 
    { 
     loop3(child_node); // add these to right node 
    } 
    xml_node<> * name_node = species->first_node("name"); 
    if(name_node != 0) 
    { 
     t1.setName(name_node->value()); 
     cout << t1.getName() << " "; 
    } 
    if(name_node == 0) 
    { 
     cout << t1.getName() << " "; 
    } 

} 

到目前为止,我能够去通过该文件,并得到序和后序的对象,但我无法弄清楚如何获取数据的序,因为没有左或右指针递归地调用函数。任何人都可以给我一些关于如何去做的指导吗?是否有可能以这种方式获取数据并成功构建树结构?感谢您的任何帮助!

前,后和有序遍历的概念只适用于二叉树:树中每个节点至多有两个孩子。

XML数据(一般情况下)不必遵循这一点:每个节点可以有任意数量的子节点。

如果你的XML文件必须作为一个二叉树来描述,那么只要将第一个物种节点视为“左”并将其兄弟(如果存在)视为“右”。

请注意,在这种情况下,通过所有兄弟的循环无法奏效。