【问题标题】:C++: Trouble with parsing XML file (MXML library)C++:解析 XML 文件时出现问题(MXML 库)
【发布时间】:2010-10-15 01:35:13
【问题描述】:

我对以下代码有疑问。

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

它编译并运行良好,只是它无法获取最后一个“半径元素”,而是返回 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>

这段代码有什么问题?

【问题讨论】:

    标签: c++ xml xml-parsing mini-xml


    【解决方案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。希望对您有所帮助。

    【讨论】:

    • 哦。是的,就是这样,我在加载之前增加了节点。哇,愚蠢的错误。
    • 是的,我正在使用 Mini-XML 库。我已编辑问题以反映这一点。
    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 2018-03-09
    • 1970-01-01
    相关资源
    最近更新 更多