2012-03-21 9 views
2

を解析:miniXMLは私がフォローするXMLファイルの構文解析しようとしているCのAPI

<root>Root 
    <pai>Pai_1 
     <filho>Pai1,Filho1</filho> 
     <filho>Pai1,Filho2</filho> 
    </pai> 
    <pai>Pai_2 
     <filho>Pai2,Filho1</filho> 
     <filho>Pai2,Filho2</filho> 
    </pai> 
</root> 

私はフォローのCコードを使用しています:

//... open file 
xml_tree = mxmlLoadFile(NULL, fp, MXML_TEXT_CALLBACK); 

node = xml_tree; 
printf("%s\n", mxmlGetText(node, NULL)); 
// here the return is: Root 
// I expected: Root, OK 

node = xml_tree->child; 
printf("%s\n", mxmlGetText(node, NULL)); 
// here the return is: Root 
// I expected: Pai_1, not OK 

node = mxmlGetFirstChild(xml_tree); 
printf("%s\n", mxmlGetText(node, NULL)); 
// here the return is: Root 
// I expected: Pai_1, not OK 

node = mxmlFindElement(xml_tree, xml_tree, "pai", NULL, NULL, MXML_DESCEND); 
printf("%s\n", mxmlGetText(node, NULL)); 
// here the return is: Pai_1 
// I expected: Pai_1, OK 

node = mxmlGetNextSibling(node); 
printf("%s\n", mxmlGetText(node, NULL)); 
// here the return is: (NULL) 
// I expected: Pai_2, not OK 

私はルートの子にアクセスするにはどうすればよいですか?私のアクセスのコンセプトが間違っていますか?

ありがとうございます。


EDIT @RutgersMike応答

後、私はminixmlの概念を理解しようとするあなたのwhileループを展開します。

root = mxmlLoadFile(NULL,fp,MXML_TEXT_CALLBACK); 
node = root; 

printf("------- Root\n"); 
fprintf(stdout,"Element = %s\n",mxmlGetElement(node)); 
fprintf(stdout," Value = %s\n",mxmlGetText(node,0)); 
printf("\n"); 

printf("------- First child of Root\n"); 
node = mxmlGetFirstChild(node); 
fprintf(stdout,"Element = %s\n",mxmlGetElement(node)); 
fprintf(stdout," Value = %s\n",mxmlGetText(node,0)); 
printf("\n"); 

printf("------- Sibling 1 of First child of Root\n"); 
node = mxmlGetNextSibling(node); 
fprintf(stdout,"Element = %s\n",mxmlGetElement(node)); 
fprintf(stdout," Value = %s\n",mxmlGetText(node,0)); 
printf("\n"); 

printf("------- Sibling 2 of First child of Root\n"); 
node = mxmlGetNextSibling(node); 
fprintf(stdout,"Element = %s\n",mxmlGetElement(node)); 
fprintf(stdout," Value = %s\n",mxmlGetText(node,0)); 
printf("\n"); 

printf("------- Sibling 3 of First child of Root\n"); 
node = mxmlGetNextSibling(node); 
fprintf(stdout,"Element = %s\n",mxmlGetElement(node)); 
fprintf(stdout," Value = %s\n",mxmlGetText(node,0)); 
printf("\n"); 

printf("------- Sibling 4 of First child of Root\n"); 
node = mxmlGetNextSibling(node); 
fprintf(stdout,"Element = %s\n",mxmlGetElement(node)); 
fprintf(stdout," Value = %s\n",mxmlGetText(node,0)); 
printf("\n"); 

結果、これがされた:

------- Root 
Element = root 
    Value = Root 

------- First child of Root 
Element = (null) 
    Value = Root 

------- Sibling 1 of First child of Root 
Element = (null) 
    Value = 

------- Sibling 2 of First child of Root 
Element = pai 
    Value = Pai_1 

------- Sibling 3 of First child of Root 
Element = (null) 
    Value = 

------- Sibling 4 of First child of Root 
Element = pai 
    Value = Pai_2 

私は思います子供と親の間のナビゲーションのこのコンセプトは少し奇妙です。なぜ兄弟間に(null)値があるのですか?

私はezxmlに戻ることを検討しています。

を使用すると、子ノードを取得するには、ここで説明した反復機能(http://www.minixml.org/mxml.html#3_7)を使用するように見えます

答えて

4

ありがとうございます。

編集:私は最初の子ノードを介してダウン反復するためにこれを書いて、それが正常に動作し、mxmlGetFirstChildmxmlGetNextSiblingを使用:

<!-- language: c --> 
mxml_node_t* node = mxmlLoadFile(NULL,f,MXML_TEXT_CALLBACK); 
while (node != NULL) 
{ 
    switch (mxmlGetType(node)) 
    { 
    case MXML_ELEMENT: 
    { 
     fprintf(stdout,"Element = %s\n",mxmlGetElement(node)); 
    } 
    break; 
    case MXML_TEXT: 
    { 
     fprintf(stdout," Value = %s\n",mxmlGetText(node,0)); 
    } 
    break; 
    default: 
    { 
    } 
    break; 
    } 
    mxml_node_t* next = mxmlGetFirstChild(node); 
    if (next != NULL) 
    { 
     node = next; 
    } 
    else 
    { 
     next = mxmlGetNextSibling(node); 
     if (next != NULL) 
     { 
     node = next; 
     } 
     else 
     { 
     node = next; 
     fprintf(stdout,"Done\n"); 
     } 
    } 
} 

は出力を生成します。

Element = root 
Value = Root 
Value = 
Element = pai 
Value = Pai_1 
Value = 
Element = filho 
Value = Pai1,Filho1 

私はあなたがいずれかを使用することができます推測getParent関数を使用してバックアップを反復するか、ファイル全体を反復処理する場合は、ノードポインタのスタックを使用して、子プロセスに入る前に最後のノードを保存します。 2つのノードタイプのデータのみを処理/印刷することに注意してください。他のノードタイプに何が含まれているかを実験したい場合は、その情報も必要です。

**あなたの編集後MORE EDIT **

私は他の誰かがlibxml2http://xmlsoft.org/examples/index.html#xmlReader)を試すことを先日提案 - そのリンクをチェックしてください。 xmlReaderの使用例を示します。読者を作成しノードを反復するのは信じられないほど簡単です。各ノードにヒットしたときに、そのノードが気になるタイプ(通常ELEMENTATTRIBUTETEXT、およびEND_ELEMENT)だけをチェックしてから、名前または値。私はそれがmxmlよりはるかに良いです。

+0

私はあなたの例の仕事をすることができませんでした。 –

+0

コンパイルされませんでしたか、期待どおりの結果が得られませんでしたか?それは何を生み出しましたか? – rutgersmike

+0

私はこのシーケンスを行う。 'ノード= xml_tree;' 'ノード= mxmlGetFirstChild(xml_tree);' 'ノード= mxmlWalkNext(ノード、xml_tree、MXML_DESCEND);' 'のprintf( ">%S \ n" は、mxmlGetElementを(ノード)); printf( ">%s \ n"、mxmlGetText(ノード、NULL)); ' 結果:(null) –

6

ちょうどmin-xmlで再生を開始しましたが、私は良い例がないことに非常に不満を抱いていましたが、XMLファイルを読んですべての部分を見るというまあまあではありませんでした。タグ間のタグ名、属性、テキスト値を表示します。終了タグを特定する方法がわかりません。標準のxmlタグがxmlファイルの先頭にあることを確認してください。 stdiostdlibstring .hファイルを含みます。

#include "mxml.h" 

int main (int argc, char **argv) { 

     FILE *fp = NULL; 

     int k = 0; 

     mxml_node_t * tree = NULL; 
     mxml_node_t * node = NULL; 

     if (argc < 2){ 
      perror("Argument Required XML File "); 
      exit(1); 
     } 
     fp = fopen (argv[1], "r"); 
     if (fp){ 
      tree = mxmlLoadFile (NULL , fp , MXML_OPAQUE_CALLBACK); 
     }else { 
      perror("Could Not Open the File Provided"); 
      exit(1); 
     } 
     if (tree){ 
       for (node = mxmlFindElement(tree, tree,NULL,NULL, NULL,MXML_DESCEND); 
         node != NULL; 
         node=mxmlWalkNext (node, NULL, MXML_DESCEND) 
         //node = mxmlFindElement(node, tree, NULL,NULL,NULL,MXML_DESCEND) 
       ){ 
         if (node->type == MXML_ELEMENT) { 
          printf("MXML_ELEMENT Node <%s>:%d \n", node->value.element.name, node->value.element.num_attrs); 
          for (k = 0; k < node->value.element.num_attrs; k++){ 
           if (node->value.element.attrs){ 
            printf ("Attribute Name :: %s \n", node->value.element.attrs[k].name); 
            printf ("Attribute Value:: %s \n", node->value.element.attrs[k].value); 
           } 
           //if (!strncmp(node->value.element.name , "display-name", 12)){ 
           // printf(" String %s \n", (char*) node->child->value.text.string); 
           //} 
          } 
         } 
         else if (node->type == MXML_REAL){ 
          printf("MXML_REAL Node is %s \n", node->value.element.name); 
         } 
         else if(node->type == MXML_OPAQUE){ 
          printf("MXML_OPAQUE Node is %s \n", node->value.element.name); 
         } 
         else if(node->type == MXML_INTEGER){ 
          printf("MXML_INTEGER Node is %s \n", node->value.element.name); 
         } 
         else if(node->type == MXML_TEXT){ 
          printf("MXML_TEXT Node is %s \n", node->value.element.name); 
         } 
         else if(node->type == MXML_IGNORE){ 
          printf("MXML_IGNORE Node is %s \n", node->value.element.name); 
         } 
         else if(node->type == MXML_CUSTOM){ 
          printf("MXML_IGNORE Node is %s \n", node->value.element.name); 
         } 
         else { 
          printf("Type Default Node is %s \n", node->value.element.name); 
         } 
       } 
     } 
     if (tree){ 
      mxmlDelete(tree); 
     } 
     if (fp){ 
      fclose(fp); 
     } 
     return 0; 
} 
+0

ありがとうございます!私はそれを非常に感謝します! –

関連する問題