2010-10-15 37 views
0

我遇到以下代码的问题。C++:解析XML文件(MXML库)时遇到问题

它使用Mini-XML库从xml文件中提取元素。

它编译和运行良好,但它无法获得最后的“radius元素”,而是返回NULL(如果我不检查子节点是否不为NULL,则崩溃)。

//Start loading <ssys> elements 
mxml_node_t *node; //temporary node to save 
mxml_node_t *subnode; //temporary subnode to save 
mxml_node_t *subnode2; //another temporary subnode to save 
const char* name_tmp; //Temporary string for names of ssys 
//Load first ssys 
node = mxmlFindElement(Systems_elem, tree, "ssys", NULL, NULL, MXML_DESCEND); 
cout << "Node 1 pointer: " << node<<endl<<endl; 
//Start loading the rest of the ssys elements (but fail if first element is NULL) 
int i = 1; 
do { 
    //Load node into vector of pointers 
    ssys_elem.push_back(node); 
    //Get name attribute 
    name_tmp = mxmlElementGetAttr(node, "name"); 
    ssys_name.push_back(name_tmp); 
    //load next ssys 
    node = mxmlFindElement(node, tree, "ssys", NULL, NULL, MXML_NO_DESCEND); 
    cout << "Node: " << node<<endl<<endl; 
    cout<<"Name: " <<name_tmp<<endl<<endl; 
    //Descend to radius element 
    subnode = mxmlFindElement(node, tree, "radius", NULL, NULL, MXML_DESCEND); 
    // 
    if(subnode != NULL){ 
     cout <<subnode->child->value.text.string<<endl<<endl; <--Trouble Here 
    } 
    i++; 
} 
while (node != NULL); 

}

这里是一块有问题的XML文件:

<ssys name="Zylex"> 
    <general> 
    <radius>3500.000000</radius> <-- I am trying to get "3500.000000" 
    <stars>400</stars> 
    <asteroids>0</asteroids> 
    <interference>300.000000</interference> 
    <nebula volatility="0.000000">250.000000</nebula> 
    </general> 
    <pos> 
    <x>438.000000</x> 
    <y>-34.000000</y> 
    </pos> 
    <assets/> 
    <jumps> 
    <jump target="Arcanis"> 
    <pos x="-3418.937501" y="-748.910119"/> 
    <radius>200.000000</radius> 
    <flags> 
    <autopos/> 
    </flags> 
    </jump> 
    <jump target="Doeston"> 
    <pos x="2991.156265" y="1817.411401"/> 
    <radius>200.000000</radius> 
    <flags> 
    <autopos/> 
    </flags> 
    </jump> 
    </jumps> 
</ssys> 
</Systems> 

什么是与此代码的问题?

回答

1

嗯,我猜你正在谈论的Mini-XML,我真的没有经验。我所看到的是你的迭代器比你的名字领先一步。我想你想要更类似于:

node = mxmlFindElement(Systems_elem, tree, "ssys", NULL, NULL, MXML_DESCEND); 
while (node) { 
    ssys_elem.push_back(node); 
    name_tmp = mxmlElementGetAttr(node, "name"); 
    ssys_name.push_back(name_tmp); 

    cout << "Node: " << node << endl << endl; 
    if (name_tmp) { 
     cout << "Name: " << name_tmp << endl << endl; 
    } 

    // Descend to radius element 
    subnode = mxmlFindElement(node, tree, "radius", NULL, NULL, MXML_DESCEND); 
    if (subnode != NULL){ 
     cout << subnode->child->value.text.string << endl << endl; <--Trouble Here 
    } 

    // iterate at the end! 
    node = mxmlFindElement(node, tree, "ssys", NULL, NULL, MXML_NO_DESCEND); 
} 

而且一般来说不要相信你有格式良好的XML。即使你认为应该有一个孩子,总是检查NULL。希望有所帮助。

+0

D'oh。是的,就是这样,我在加载之前递增了节点。哇,愚蠢的错误。 – Biosci3c 2010-10-15 02:34:54

+0

是的,我正在使用Mini-XML库。我编辑了这个问题来反映这一点。 – Biosci3c 2010-10-15 02:35:44

+0

感谢您的帮助 – Biosci3c 2010-10-15 04:47:54