C++:解析XML文件(MXML库)时遇到问题
问题描述:
我遇到以下代码的问题。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>
什么是与此代码的问题?
答
嗯,我猜你正在谈论的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。希望有所帮助。
D'oh。是的,就是这样,我在加载之前递增了节点。哇,愚蠢的错误。 – Biosci3c 2010-10-15 02:34:54
是的,我正在使用Mini-XML库。我编辑了这个问题来反映这一点。 – Biosci3c 2010-10-15 02:35:44
感谢您的帮助 – Biosci3c 2010-10-15 04:47:54