1

我在 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 或其中一个可能根本不存在)。我该如何检查?

4

1 回答 1

0

好的,我还没有编译下面的代码,但它应该足够准确,可以根据您的需要进行修改。它至少应该说明您可以用于您的目的的方法和功能。可能有更好的方法,但如果您没有收到其他回复,这将满足您的需求。

对于您描述的 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-您可以使用相同类型的 while 循环来遍历 childnode1 级别的兄弟节点。如果你需要检查兄弟姐妹的名字,你可以使用

 string strNodeName = "childnode2";
 if (current_node->name() == strNodeName) {
     // current node is called childnode2 - do your processing.
 }

如果您不需要检查节点名称,只需使用它来循环 rootnode 下的所有子节点

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.
于 2012-08-02T20:19:01.427 回答