首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++:解析XML文件时出现问题(MXML库)

C++:解析XML文件时出现问题(MXML库)
EN

Stack Overflow用户
提问于 2010-10-15 09:35:14
回答 1查看 1.3K关注 0票数 0

我对下面的代码有一个问题。

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

它可以很好地编译和运行,只是它不能获得最后一个"radius元素“,而是返回NULL (如果我不检查subnode是否为NULL,它就会崩溃)。

代码语言:javascript
复制
//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文件的一部分:

代码语言:javascript
复制
 <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>

这段代码有什么问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-10-15 10:29:48

好吧,我猜你说的是Mini-XML,老实说我没有使用它的经验。我看到的是你的迭代器比你的名字快了一步。我觉得你想要的东西更像:

代码语言:javascript
复制
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。即使你认为应该有一个子级,也要检查是否为空。希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3938862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档