我在C ++中使用Rapidxml在一个XML文件中读取
我有一个基于下面的例子中的两个问题
<?xml version="1.0" encoding="utf-8"?>
<rootnode version="1.0" type="example">
<childnode1 entry="1">
<evendeepernode attr1="cat" attr2="dog"/>
<evendeepernode attr1="lion" attr2="wolf"/>
</childnode1>
<childnode2 entry="1">
</childnode2>
</rootnode>
1-如果相同类型的兄弟姐妹(evendeepernode)的数目是可变的。 我如何检查呢?
2-如果有不同的兄弟姐妹(例如childnode1&childnode2),并有数目是可变的(例如可以有多于1级childnode1的和/或可以有多于1级childnode2的或它们中的一个可能不存在的话)。 我怎么能检查是什么?
OK我没有编译下面的代码,但它应该是足够准确的把它修改您的需求。 它至少应该说明的方法,并可以使用你的目的的功能。 可能有更好的方法,但这会怎么做,如果你没有其他答复你所需要的。
对于像你描述1-问题,我用类似下面的代码
xml_document<> doc;
doc.parse<0>(xml_buffer); // parse your string
xml_node<>* rootnode = doc.first_node("rootnode"); // Get first node
xml_node<>* childnode1 = rootnode->first_node("childnode1"); // childnode1
if (childnode1 != NULL) {
// get first deeper node and loop over them all
int number_of_siblings = 0;
xml_node<>* deepernode = childnode1->first_node();
while (deepernode != NULL) {
// Do processing on this node
// Your processing code here....
// now get the next deepernode in this current level of nesting
// pointer will be NULL when no more siblings
deepernode = deepernode->next_sibling();
number_of_siblings++;
}
// Your xml had number_of_sibling nodes at this level
}
对于你的问题2 - 您可以在childnode1水平通过兄弟节点使用同一种while循环的循环。 如果您需要检查兄弟的名字,你可以使用
string strNodeName = "childnode2";
if (current_node->name() == strNodeName) {
// current node is called childnode2 - do your processing.
}
如果你不需要检查节点名称,只是用它来遍历根节点下的所有子节点
xml_document<> doc;
doc.parse<0>(xml_buffer); // parse your string
xml_node<>* rootnode = doc.first_node("rootnode"); // Get first node
xml_node<>* childnode = rootnode->first_node(); // get first childnode
int child_node_count = 0;
while (childnode != NULL) {
// Do processing on this node
// get sibling of current node (if there is one)
childnode = childnode->next_sibling();
child_node_count++;
}
// child_node_count is now the number of child nodes under rootnode.
文章来源: check for variable number of sibling nodes & different siblings in Rapidxml