1

C ++でRapidxmlを使用してxmlファイルを読み込んでいます

次の例に基づいて2つの質問があります

<?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 ) があり、その数が可変の場合 (例: 複数の childnode1 が存在する可能性がある、および/または複数の childnode2 が存在する可能性がある、またはそれらの 1 つがまったく存在しない可能性がある)。どうすればそれを確認できますか?

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 に答える